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

子查询

子查询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 语句,进行测试:
 

[plain] view plaincopy

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




 

列子查询

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

思路

先确定数据源,学生表。

select * from student where c_id in ?;

然后确定全部有效的班级 ID。

select id from class;

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

[plain] view plaincopy

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





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

any等价于in,表示其中一个;

any等价于smoe,而anysome用于否定时却有些区别;

all表示等于全部。

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

[plain] view plaincopy

  1. -- 列子查询  
  2. select * from student where c_id = any (select id from class);  
  3.   
  4. select * from student where c_id = some (select id from class);  
  5.   
  6. select * from student where c_id = all (select id from class);  





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

[plain] view plaincopy

  1. -- 列子查询  
  2. select * from student where c_id != any (select id from class);  
  3.   
  4. select * from student where c_id != some (select id from class);  
  5.   
  6. select * from student where c_id != all (select id from class);  





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

查询class



查询student



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值