“Nested Query(嵌套查询)”通常指在一个 SQL 查询中嵌套另一个查询,也叫子查询(Subquery)。下面从概念 → 语法 → 常见类型 → 示例 → 注意事项一步步说明。
嵌套查询是指:
一个 SELECT 语句中,包含另一个 SELECT 语句
外层查询叫 外部查询(Outer Query)
内层查询叫 子查询(Subquery)
SELECT ...
FROM ...
WHERE column OPERATOR (
SELECT ...
FROM ...
);
子查询可以出现在:
用于比较运算
SELECT name
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
✅ 子查询返回一个数字
配合 IN、ANY、ALL
SELECT name
FROM employees
WHERE department_id IN (
SELECT id
FROM departments
WHERE location = 'Beijing'
);
SELECT *
FROM employees
WHERE (department_id, salary) = (
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
LIMIT 1
);
SELECT dept_name, avg_salary
FROM (
SELECT d.name AS dept_name, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.department_id = d.id
GROUP BY d.name
) AS temp
WHERE avg_salary > 10000;
子查询依赖外部查询
SELECT e1.name
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
✅ 每一行都会执行一次子查询
| 方式 | 特点 |
|---|---|
| 子查询 | 逻辑清晰,易读 |
| JOIN | 性能通常更好 |
例如:
-- 子查询
SELECT name
FROM employees
WHERE department_id IN (
SELECT id FROM departments WHERE location='Shanghai'
);
-- JOIN
SELECT e.name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.location = 'Shanghai';
=找出工资高于所在部门平均工资的员工
SELECT name, salary
FROM employees e
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department_id = e.department_id
);
如果你用的是 MySQL / PostgreSQL / SQL Server / Oracle,或者想写多层嵌套 / EXISTS / NOT EXISTS,可以告诉我,我可以给你更针对性的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。