史上最简单的 MySQL 教程(三十一)「子查询(上)」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

子查询

子查询sub query,查询是在某个查询结果之上进行的,一条select语句内部包含了另外一条select语句。

分类

子查询有两种分类方式,分别为:按按结果分类和位置分类。

按结果分类,即根据子查询得到的数据进行分类(理论上,任何一个查询结果都可以理解为一个二维表),分别为:

  • 标量子查询:子查询得到的结果是一行一列,出现的位置在where之后;
  • 列子查询:子查询得到的结果是一列多行,出现的位置在where之后;
  • 行子查询:子查询得到的结果是多行一列(多行多列),出现的位置在where之后;
  • 表子查询:子查询得到的结果是多行多列,出现的位置在from之后。

按位置分类,即根据子查询(select语句)在外部查询(select语句)中出现的位置进行分类,分别为:

  • from子查询:子查询出现在from之后;
  • where子查询:子查询出现在where条件之中;
  • exists子查询:子查询出现在exists里面。

标量子查询

需求:现知道班级名称为PM3.1,想要获取该班的全部学生。

思路

  • 先确定数据源,学生表。
  • select * from student where c_id = ?;
  • 然后获取班级 ID,可以通过(班级表)班级名称来确定。
  • select id from class where grade = "PM3.1";

执行如下 SQL 语句,进行测试:

-- 标量子查询
select * from student where c_id = (select id from class where grade = "PM3.1");
biaol

列子查询

需求:查询所有在读班级(学生表中存在的班级)的学生。

思路

  • 先确定数据源,学生表。
  • select * from student where c_id in ?;
  • 然后确定全部有效的班级 ID。
  • select id from class;

执行如下 SQL 语句,进行测试:

-- 列子查询
select * from student where c_id in (select id from class);
column

如上图所示,我们完成了列子查询。在列子查询的结果为一行多列时,我们需要使用in作为条件进行匹配;此外,在 MySQL 中还有三个类似的条件,分别为:allsomeany

  • any等价于in,表示其中一个;
  • any等价于smoe,而anysome用于否定时却有些区别;
  • all表示等于全部。

值得注意的是,在我们使用上面三个关键字中任何一个的时候,都需要搭配=使用,例如:

-- 列子查询
select * from student where c_id = any (select id from class);

select * from student where c_id = some (select id from class);

select * from student where c_id = all (select id from class);
ass

如上图所示,为anysomeall的肯定用法,下面我们来测试其否定用法:

-- 列子查询
select * from student where c_id != any (select id from class);

select * from student where c_id != some (select id from class);

select * from student where c_id != all (select id from class);
fouze

观察上图,我们会发现anysomeall在用于否定时,其会将null值排除掉。实际上,在真正的开发中,这三个关键字并不常用。


查询class

class

查询student

studnet

温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-BABY MILESTONES

课程内容 Ø图片的读写 Ø序列化 Ø双向数据绑定     Baby Milestones将婴儿从出生到2岁之间的发展关键里程碑通知给父母。该应用程序使得父母能...

17910
来自专栏我杨某人的青春满是悔恨

Kingfisher源码阅读(一)

Kingfisher是喵神写的一个异步下载和缓存图片的Swift库,github上将近3k的Star,相信不需要我再安利了。它的中文简介在这里,github地址...

1142
来自专栏深度学习自然语言处理

python科学计算之Pandas使用(三)

Pandas 是基于 NumPy 的一个非常好用的库,正如名字一样,人见人爱。之所以如此,就在于不论是读取、处理数据,用它都非常简单。前两天介绍了 最常见的Pa...

701
来自专栏vue学习

关于vue的命名规范

1315
来自专栏数据和云

如何编写更好的SQL查询:终极指南(下)

SQL是数据挖掘分析行业不可或缺的一项技能,对于SQL来说,编写查询语句只是第一步,确保查询语句高效并且适合于你的数据库操作工作,才是最重要的。在上一篇文章中,...

2756
来自专栏ChaMd5安全团队

【首发】记DedeCMS一处由哈希长度拓展攻击引起的越权漏洞

漏洞影响:Dedecms(织梦CMS) V5.7.72 正式版20180109 (最新版)

1343
来自专栏游戏开发那些事

【Linux程序设计】之Linux库函数的使用,多文件程序开发,静态与共享函数

这个系列的博客贴的都是我大二的时候学习Linux系统高级编程时的一些实验程序,都挺简单的。贴出来纯粹是聊胜于无。

682
来自专栏java达人

SQL索引优化

序言 数据库的优化方法有很多种,在应用层来说,主要是基于索引的优化。本次秘笈根据实际的工作经验,在研发原来已有的方法的基础上,进行了一些扩充,总结了基于索引的S...

1848
来自专栏性能与架构

分方式缓存常用的一致性hash是什么原理

一致性hash是用来解决什么问题的? 先看一个场景 有n个cache服务器,一个对象object映射到哪个cache上呢? 可以采用通用方法计算objec...

3449
来自专栏更流畅、简洁的软件开发方式

好大一棵树,新春的祝福(一):n级分类的数据结构

     这个树的结构几年前在csdn里面也发过了一次,现在看看,主体结构居然没有什么变化,用了这么长的时间,自我感觉还是很好用的。而且在这个基础之上把其他的功...

2145

扫码关注云+社区