概述
- 子查询(
Subquery
)是嵌套在另一个SQL
查询中的查询 - 子查询可以位于
SELECT
、FROM
、WHERE
、HAVING
等子句中,用于返回一个单一值、一列值或者一个表 - 子查询的结果可以用来为主查询提供条件或数据
子查询的类型
- 标量子查询
- 返回单一值的子查询
- 列子查询
- 返回一列值的子查询
- 行子查询
- 返回单行数据的子查询
- 表子查询
- 返回多行和多列数据的子查询
子查询位置
select子句
- 子查询可以用于计算列值
1 2 |
SELECT emp_id, emp_name, (SELECT dept_name FROM departments WHERE departments.dept_id = employees.dept_id) AS dept_name FROM employees; |
from子句
- 子查询可以作为一个临时表使用
1 2 3 |
SELECT dept_id, AVG(salary) AS avg_salary FROM (SELECT * FROM employees WHERE hire_date > '2020-01-01') AS recent_employees GROUP BY dept_id; |
where子句
- 子查询可以用于过滤条件
1 2 3 |
SELECT emp_name FROM employees WHERE dept_id = (SELECT dept_id FROM departments WHERE dept_name = 'HR'); |
having子句
- 子查询可以用于聚合结果的过滤条件
1 2 3 4 |
SELECT dept_id, AVG(salary) FROM employees GROUP BY dept_id HAVING AVG(salary) > (SELECT AVG(salary) FROM employees); |
子查询分类
单行子查询
- 返回单行单列的结果,通常用于比较操作符(
=
,<
,>
,<=
,>=
)
1 2 3 |
SELECT emp_name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees); |
多行子查询
- 返回多行单列的结果,通常用于集合操作符(
IN
,ANY
,ALL
)
1 2 3 |
SELECT emp_name FROM employees WHERE dept_id IN (SELECT dept_id FROM departments WHERE location = 'New York'); |
相关子查询
- 子查询依赖于外部查询的结果
1 2 3 |
SELECT e1.emp_name, e1.salary FROM employees e1 WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e2.dept_id = e1.dept_id); |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 数据处理函数:单行处理函数10/24
- ♥ 表_约束-外键10/27
- ♥ 表_约束-主键10/26
- ♥ 表操作_查询-分组 || 分组筛选10/24
- ♥ 存储引擎_介绍 && 选择10/28
- ♥ 表_修改表结构10/26