SQL 子查询
学习在 WHERE 中使用子查询 · 难度:进阶 · +15XP
SQL 子查询
SQL 子查询 — 在查询中嵌套查询
学习前的准备
你需要一个 MySQL 数据库环境。子查询是把一个查询的结果用作另一个查询的输入——这是 SQL 从“基本操作”迈向“复杂分析”的关键一步。
什么是子查询?
子查询是嵌套在另一个查询内部的 SELECT 语句。可以放在 WHERE、FROM 或 SELECT 中。
-- 找出工资高于公司平均工资的员工
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
子查询在 WHERE 中
-- 使用 IN
SELECT name, dept FROM employees
WHERE dept IN (SELECT DISTINCT dept FROM employees WHERE salary > 8000);
-- 使用 EXISTS
SELECT dept FROM (SELECT DISTINCT dept FROM employees) AS d
WHERE EXISTS (
SELECT 1 FROM employees
WHERE dept = d.dept AND salary > 8000
);
-- 使用 ANY
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE dept = '市场部');
子查询在 FROM 中(派生表)
SELECT dept, avg_salary
FROM (
SELECT dept, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept
) AS dept_stats
WHERE avg_salary > 7500;
子查询在 SELECT 中(标量子查询)
SELECT
name,
salary,
(SELECT MAX(salary) FROM employees) AS max_salary,
(SELECT MAX(salary) FROM employees) - salary AS diff
FROM employees;
关联子查询
关联子查询依赖于外层查询的每一行,对外层的每一行都会执行一次。
-- 找出每个部门中工资最高的员工
SELECT name, dept, salary
FROM employees e1
WHERE salary = (
SELECT MAX(salary)
FROM employees e2
WHERE e2.dept = e1.dept
);
小结
子查询让你能在一个查询中使用另一个查询的结果。WHERE 子查询用于条件筛选,FROM 子查询用作临时表,SELECT 子查询提供计算列。关联子查询则让子查询能根据外层的每一行动态计算。掌握子查询后,你已经能够应对 80% 的日常数据分析需求。