温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何写 Nested Query

发布时间:2026-09-22 16:03:02 来源:亿速云 阅读:90 作者:小樊 栏目:数据库

“Nested Query(嵌套查询)”通常指在一个 SQL 查询中嵌套另一个查询,也叫子查询(Subquery)。下面从概念 → 语法 → 常见类型 → 示例 → 注意事项一步步说明。


一、什么是 Nested Query

嵌套查询是指:

一个 SELECT 语句中,包含另一个 SELECT 语句

外层查询叫 外部查询(Outer Query)
内层查询叫 子查询(Subquery)

SELECT ...
FROM ...
WHERE column OPERATOR (
    SELECT ...
    FROM ...
);

二、子查询的常见位置

子查询可以出现在:

  1. WHERE 子句(最常见)
  2. FROM 子句(派生表)
  3. SELECT 子句
  4. HAVING 子句

三、按返回结果分类

1️⃣ 标量子查询(返回 1 个值)

用于比较运算

SELECT name
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

✅ 子查询返回一个数字


2️⃣ 列子查询(返回一列)

配合 INANYALL

SELECT name
FROM employees
WHERE department_id IN (
    SELECT id
    FROM departments
    WHERE location = 'Beijing'
);

3️⃣ 行子查询(返回一行)

SELECT *
FROM employees
WHERE (department_id, salary) = (
    SELECT department_id, MAX(salary)
    FROM employees
    GROUP BY department_id
    LIMIT 1
);

4️⃣ 表子查询(FROM 中的子查询)

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;

四、相关子查询(Correlated Subquery)

子查询依赖外部查询

SELECT e1.name
FROM employees e1
WHERE salary > (
    SELECT AVG(salary)
    FROM employees e2
    WHERE e2.department_id = e1.department_id
);

✅ 每一行都会执行一次子查询


五、与 JOIN 的对比

方式 特点
子查询 逻辑清晰,易读
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';

六、常见错误 ❌

  1. 子查询返回多行却用 =
  2. 忘记给 FROM 子查询起别名
  3. 相关子查询导致性能差

七、练习示例

找出工资高于所在部门平均工资的员工

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,可以告诉我,我可以给你更针对性的写法。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI