子查询
子查询指的是一个查询语句嵌套在另一个查询语句内部的查询(从MySQL4.1开始引入)。
1、子查询的基本使用
语法格式:
select select_list
from table
where expr operator
(select select_list
from table);
说明:1、子查询(内查询)在主查询之前一次执行完成。
2、子查询的结果被主查询(外查询)使用
注意事项:
1、子查询要包含在括号内。
2、将子查询放在比较条件的右侧。
3、单行操作符对应单行子查询,多行操作符对应多行子查询。
2、子查询的分类
2.1分类方式1(根据内查询的结果时返回一条记录还是多条记录):
单行子查询:
如图:
多行子查询:
2.1分类方式2(内查询是否被执行多次):
不相关子查询:子查询从数据表中查询了数据结果,如果这个数据行结果只执行了一次,然后这个数据结构作为主查询的条件执行,那么这样的子查询叫做不相关子查询。
相关子查询:如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。
3、单行子查询
3.1 单行比较操作符
操作符 | 含义 |
---|---|
= | equal to |
> | greater than |
>= | greater than or equal to |
< | less than |
<= | less than or equal to |
<> | not equal to |
举例: |
查询工资大于149号员工工资的员工的信息
3.2 Case中的子查询
显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’。
3.3 子查询中的空值问题
如果子查询返回的是null,那么整个查询的结果是null
4、多行子查询
1、也被称为集合比较子查询
2、内查询返回多行
3、使用多行比较符
4.1 多行比较操作符
操作符 | 含义 |
---|---|
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较符一起使用,和子查询返回的所有值比较 |
SOME | 实际上是ANY的别名,作用相同,一般常使用ANY |
举例:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary
空值问题:如果子查询中是空值的话,最终结果集也是空值
5、相关子查询
如果子查询的执行依赖于外部查询,通常情况小都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每次执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询。
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行·一次子查询。
举例:
5.1 exists和NOT exists关键字
关联子查询通常也会和exists操作符一起来使用,用来检查子查询中是否存在满足条件的行。
如果在子查询中不存在满足条件的行:
条件返回FALSE
继续在子查询中查找
如果在子查询中存在满足条件的行:
不在子查询中继续查找
条件返回true
NOT exists关键字表示如果不存在某种条件,则返回true,否则返回false。
举例:
6、相关更新
使用相关子查询依据一个表中的数据更新另一个表中的数据
举例:
7、自连接和子查询的比较
自连接比子查询好。因为自连接查询比子查询快。在底层中如果你使用的是子查询进行查询,但是你的子查询可以转换为自连接的话,底层的优化器会将你的子查询语句转换为自连接的语句进行查询!!!