目录
老规矩先上 表:
一、子查询
- 语法结构
子查询(内查询)在主查询之前一次执行完成
子查询的结果被主查询(外查询)使用 注意事项:
○子查询要包含在括号内
○将子查询放在比较条件的右侧
○单行操作符对应单行子查询,多行操作符对应多行子查询
二、分类
- 按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询
单行子查询就是返回一条记录
多行子查询就是返回多条记录 - 按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询
子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询
三、单行子查询
操作符 | 含义 |
---|---|
= | 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 employees
GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary)
FROM employees
WHERE 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_id
WHEN(
SELECT department_id
FROM departments
WHERE location_id = 1800)
THEN 'Canada' ELSE 'USA' END) location
FROM employees;
🔥单行子查询的空值问题
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas'
);
子查询不返回任何行
🔥非法使用子查询
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id
);
四、多行子查询
内查询返回多行
使用多行比较操作符
:
操作符 | 含义 |
---|---|
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
SOME | 实际上是ANY的别名,作用相同,一般常使用ANY |
🔥多行子查询的空值问题
SELECT last_name
FROM employees
WHERE employee_id NOT IN (
SELECT manager_id
FROM emp
);
五、相关子查询
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件
关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询
🔥EXISTS 与 NOT EXISTS
关键字
用来检查在子查询中是否存在满足条件的行
- 如果在子查询中不存在满足条件的行:
○条件返回 FALSE
○继续在子查询中查找 - 如果在子查询中存在满足条件的行:
○不在子查询中继续查找
○条件返回 TRUE
NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE
🔥更新
UPDATE table1 alias1
SET column = (SELECT expression
FROM table2 alias2
WHERE alias1.column = alias2.column
);
使用相关子查询依据一个表中的数据更新另一个表的数据
🔥删除
DELETE FROM table1 alias1
WHERE column operator (SELECT expression
FROM table2 alias2
WHERE alias1.column = alias2.column
);
使用相关子查询依据一个表中的数据删除另一个表的数据