嵌套子查询(Nested Subquery)是指在一个 SQL 查询中,子查询嵌套在另一个查询内部(可以多层嵌套)。常见于 SELECT、FROM、WHERE、HAVING 等子句中。
下面从基本结构 → 常见用法 → 示例 → 注意事项逐步说明。
SELECT 列
FROM 表
WHERE 列 操作符 (
SELECT 列
FROM 表
WHERE 条件
);
子查询先执行,其结果作为外层查询的条件或数据源。
SELECT name
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
使用 IN / ANY / ALL
SELECT name
FROM employee
WHERE department_id IN (
SELECT id
FROM department
WHERE location = 'Beijing'
);
SELECT
name,
(SELECT COUNT(*)
FROM orders o
WHERE o.customer_id = c.id) AS order_count
FROM customer c;
⚠️ 子查询必须返回单行单列
SELECT dept, avg_salary
FROM (
SELECT department_id AS dept, AVG(salary) AS avg_salary
FROM employee
GROUP BY department_id
) t
WHERE avg_salary > 10000;
✅ 子查询必须起别名
SELECT department_id, AVG(salary)
FROM employee
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employee
);
SELECT name
FROM employee
WHERE department_id IN (
SELECT id
FROM department
WHERE manager_id = (
SELECT id
FROM manager
WHERE name = 'Tom'
)
);
子查询依赖外层查询的值:
SELECT e1.name
FROM employee e1
WHERE salary > (
SELECT AVG(salary)
FROM employee e2
WHERE e2.department_id = e1.department_id
);
✅ 外层每读一行,子查询执行一次
() 包裹WHERE 子查询:
= > <IN / ANY / ALLFROM 子查询必须起别名JOIN 优化)-- 子查询
SELECT name
FROM employee
WHERE department_id IN (
SELECT id FROM department WHERE location='Shanghai'
);
-- JOIN 写法(通常更高效)
SELECT e.name
FROM employee e
JOIN department d ON e.department_id = d.id
WHERE d.location = 'Shanghai';
如果你愿意,可以告诉我:
我可以帮你直接写一条可用的嵌套子查询 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。