子查询
# 子查询
将一个查询语句嵌套在查询语句里的一个查询语句。被嵌套在内的叫子查询(内查询)、外面的叫主查询(外查询)。
# 规范
- 子查询必须写在括号内;
- 子查询为了可读性,一般写在操作符的右边;
- 子查询不支持
GROUP BY
子句和LIMIT
子句;
# 分类
可分为两类
单行子查询和多行子查询;
单行子查询的子查询(内查询)返回一条查询结果,多行子查询返回多条查询结果
相关子查询和非相关子查询;
非相关子查询的子查询(内查询)的数据是固定的,不会使用到主查询的数据,而相关子查询会使用到主的查询的数据。
# 单行子查询
子查询(内查询)返回一条查询结果。
使用 =
>
>=
<
<=
<>
操作符
查询比平均工资高的员工
SELECT last_name,salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
1
2
3
4
5
6
2
3
4
5
6
# 多行子查询
子查询(内查询)返回多条查询结果。
使用 IN
ANY
SOME
ALL
操作符
操作符 | 含义 |
---|---|
IN | 等于列表中的任意一个 |
ANY | 需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL | 需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
SOME | 实际上是 ANY 的别名,作用相同,一般常使用 ANY |
查询所在部门大于平均工资的员工
SELECT last_name,department_id,salary
FROM employees
WHERE department_id IN (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) >(
SELECT AVG(salary)
FROM employees
)
);
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 不相关子查询
不依赖于外部查询的数据。
上面两个子查询的示例就是
# 相关子查询
查询工资大于本部门平均工资的员工
SELECT salary,last_name,department_id
FROM employees e
WHERE salary >(
SELECT AVG(d.salary)
FROM employees d
WHERE d.department_id=e.department_id
);
1
2
3
4
5
6
7
2
3
4
5
6
7
# 其他
# 派生表
当子查询位于 FROM
子句时,这个子查询称为派生表,并且派生表必须要有别名
查询在使用的部门的编号小于100的编号
SELECT t.department_id
FROM (
SELECT department_id
FROM employees
GROUP BY department_id
) t
WHERE t.department_id<100;
1
2
3
4
5
6
7
2
3
4
5
6
7
# 参考链接
上次更新: 2023/08/05, 10:48:31