写在前面
- 若子查询结构复杂,则建议从里往外写;若是相关子查询,通常从外往里写
- 在select中,除了group by和limit之外,其他位置都可以声明子查询
- 子查询的结果被主查询使用
- 注意事项:
- 子查询要包含在括号内
- 将子查询放在比较条件的右侧
- 单行操作符对应单行子查询,多行操作符对应多行子查询
- Mysql中聚合函数不能嵌套,Oracle中聚合函数可以嵌套
- from 后面的子查询为一张虚拟表,必须有别名
一、子查询的分类
- 角度1:单行子查询 vs 多行子查询
- 角度2:相关子查询 vs 不相关子查询
- 子查询是否被执行多次。
- 相关子查询的需求:查询工资大于本部门平均工资的员工信息。查询的数据与返回的结果集相关
- 不相关子查询的需求:查询工资大于本公司平均工资的员工信息。
二、单行子查询 vs 多行子查询
2.1 单行子查询
- 单行操作符:=、>、>=、<、<=、<>(不相等)
SELECT last_name,salary
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE employee_id = 149
);
SELECT department_id,MIN(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
WHERE department_id = 110
);
SELECT employee_id,last_name,(CASE department_id WHEN (
SELECT department_id
FROM departments
WHERE location_id