嵌套 SQL 查询(Nested Query / Subquery)是指在一个 SQL 语句中嵌套另一个 SQL 查询,通常外层查询依赖内层查询的结果。下面从概念 → 分类 → 写法示例 → 注意事项系统讲一下。
**子查询(Subquery)**是写在 SELECT / FROM / WHERE / HAVING 中的查询语句,用括号 () 包裹。
SELECT *
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'Beijing'
);
用于过滤数据
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
SELECT name
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
WHERE status = 'active'
);
SELECT d.name
FROM departments d
WHERE EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.id
);
子查询当作一张临时表
SELECT dept_id, avg_salary
FROM (
SELECT department_id AS dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
) t
WHERE avg_salary > 10000;
⚠️ 子查询必须有别名(如 t)
用于计算字段
SELECT name,
(SELECT COUNT(*)
FROM orders o
WHERE o.customer_id = c.id) AS order_count
FROM customers c;
SELECT department_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);
子查询不依赖外层
SELECT *
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
子查询引用外层字段
SELECT e.name
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);
SELECT name
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
WHERE location IN (
SELECT city
FROM regions
WHERE country = 'China'
)
);
❌ 子查询返回多行却用 =
✅ 用 IN 或 EXISTS
❌ FROM 子查询没别名
✅ 一定要写 AS t
❌ 相关子查询性能差
✅ 可用 JOIN 优化
WITH)WITH avg_sal AS (
SELECT department_id, AVG(salary) s
FROM employees
GROUP BY department_id
)
SELECT e.name
FROM employees e
JOIN avg_sal a ON e.department_id = a.department_id
WHERE e.salary > a.s;
如果你有具体业务场景 / 数据库(MySQL、PostgreSQL、Oracle),我可以帮你写可直接用的嵌套 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。