子查询 的顶级详述
目录
- 一、子查询
- 二、分类
- 三、单行子查询
-
- 🔥HAVING 中的子查询
- 🔥CASE中的子查询
- 🔥单行子查询的空值问题
- 🔥非法使用子查询
- 四、多行子查询
-
- 🔥多行子查询的空值问题
- 五、相关子查询
-
- 🔥EXISTS 与 NOT EXISTS
- 🔥更新
- 🔥删除
老规矩先上 表:
一、子查询
- 语法结构
子查询(内查询)在主查询之前一次执行完成
子查询的结果被主查询(外查询)使用 注意事项:
○子查询要包含在括号内
○将子查询放在比较条件的右侧
○单行操作符对应单行子查询,多行操作符对应多行子查询
二、分类
- 按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询
单行子查询就是返回一条记录
多行子查询就是返回多条记录 - 按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询
子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询
三、单行子查询
操作符 | 含义 |
---|---|
= | equal to |
> | greater than |
>= | greater than or equal to |
< | less than |
<= | less than or equal to |
not equal to |
🔥HAVING 中的子查询
首先执行子查询
向主查询中的HAVING 子句返回结果
例题:
查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id, MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) >(SELECT MIN(salary)FROM employeesWHERE department_id = 50);
🔥CASE中的子查询
例题:
显式员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’
SELECT employee_id, last_name,(CASE department_idWHEN(SELECT department_id FROM departmentsWHERE location_id = 1800)THEN 'Canada' ELSE 'USA' END) locationFROM employees;
🔥单行子查询的空值问题
SELECT last_name, job_idFROM employeesWHERE job_id =(SELECT job_idFROM employeesWHERE last_name = 'Haas');
子查询不返回任何行
🔥非法使用子查询
SELECT employee_id, last_nameFROM employeesWHERE salary =(SELECT MIN(salary)FROM employeesGROUP BY department_id);
四、多行子查询
内查询返回多行
使用多行比较操作符
:
操作符 | 含义 |
---|---|
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
SOME | 实际上是ANY的别名,作用相同,一般常使用ANY |
🔥多行子查询的空值问题
SELECT last_nameFROM employeesWHERE employee_id NOT IN (SELECT manager_idFROM emp);
五、相关子查询
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件
关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询
🔥EXISTS 与 NOT EXISTS
关键字
用来检查在子查询中是否存在满足条件的行
- 如果在子查询中不存在满足条件的行:
○条件返回 FALSE
○继续在子查询中查找 - 如果在子查询中存在满足条件的行:
○不在子查询中继续查找
○条件返回 TRUE
NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE
🔥更新
UPDATE table1 alias1SET column = (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column );
使用相关子查询依据一个表中的数据更新另一个表的数据
🔥删除
DELETE FROM table1 alias1WHERE column operator (SELECT expression FROM table2 alias2 WHERE alias1.column = alias2.column );
使用相关子查询依据一个表中的数据删除另一个表的数据