SQL之子查询

文章有点长,请耐心看完

·子查询

什么是子查询
子查询:sub query
官方介绍:
在这里插入图片描述
通俗易懂介绍:
子查询:在一条select语句中,嵌入了另一条select语句,那么被嵌入的select语句称为select语句

主查询
就是注意的查询对象,就是第一条select语句,确定了用户所要获取的数据目标(数据源),以及具体得到的字段信息。

主查询与子查询的关系
1.子查询是嵌入到主查询中的。
2.子查询是辅助主查询的:要么作为条件,要么作为数据源。
3.子查询其实可以独立存在,是一条完整的select语句。

·子查询的分类

按功能来划分
标量子查询:子查询返回的结果是一个数据(一行一列)
列子查询:返回的结果是一列(一列多行)
行子查询:返回的结果是一行(一行多列)
表子查询:返回的结果是多行多列
exists子查询:返回的结果是1或者0(类似布尔操作);
按位置分
where子查询:子查询出现的位置在where条件中
from子查询:子查询出现的位置在from数据源中(做数据源)

一、标量子查询

1、概念
标量子查询:子查询返回的结果是一个数据(一行一列)
2、基本语法
select * from 数据源 where 条件判断 =/<>(select 字段名from 数据源 where 条件判断);//子查询得到的结果只有一个值
在这里插入图片描述

二、列子查询

1、概念
列子查询:返回的结果是一列(一列多行)
2、基本语法
select */字段名 from 数据源 where 条件判断 in(列子查询);
获取已经存在的学生所在班级的所有班级名字
在这里插入图片描述

三、行子查询

1、概念
行子查询:返回的结果是一行(一行多列)

2、行元素
行元素:字段元素是指一个字段对应的值,行元素对应的就是多个字段:多个字段合起来作为一个元素参与运算

3、基本语法
select */字段名 from 数据源 where 条件[(构造一个行元素)]=(行子查询)

获取班级年龄最大,且身高最高的学生
在这里插入图片描述
总结:已经学过3个常见的子查询
标量子查询、列子查询和行子查询:都属于where子查询。

四、表子查询

1、概念
表子查询:返回的结果是多行多列,表子查询与行子查询非常相似,只是行只查询需要产生行元素,而表子查询没有。

行子查询用于where1判断:where子查询

表子查询是用于from数据源:from子查询

2、基本语法
select 字段列表 from(子查询) as 别名 [where] [group by] [having][order by] [limit];

获取每个班上最高身高的学生(一个)
在这里插入图片描述

五、exists子查询

1、概念
exists子查询:返回的结果是1或者0(类似布尔操作);

2、基本语法
where exists(查询语句);//exists是根据查询得到的结果进行判断,如果存在,那么返回1,否则返回0;

where 1(0):永远为真(假);

求出有学生在的所有班级
在这里插入图片描述

六、子查询中特定关键字的使用

(一)、in

主查询 where 条件 in(列子查询);

(二)、any
任意一个
=any(列子查询):条件在查询结果中有任意一个匹配即可,等价于in。
<>any(列子查询):条件在查询结果中不等于任意一个
1 = any(1,2,3)=======true
1 <> any(1,2,3)======true
在这里插入图片描述
在这里插入图片描述
三)、some
与any完全一样;在国外some与any的正面含义一致,但是否定含义大不相同(not any与not some)
开发者为了让对应的使用者不在语法上纠结,重新设计了some

(四)、all
=all(列子查询):等于里面的所有
<>all(列子查询):不等于里面的所有
在这里插入图片描述

如果对应的匹配字段为null,那么不参与匹配。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44105778/article/details/85641661