温馨提示×

温馨提示×

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

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

如何写嵌套子查询

发布时间:2026-09-16 11:52:16 来源:亿速云 阅读:91 作者:小樊 栏目:数据库

嵌套子查询(Nested Subquery)是指在一个 SQL 查询中,子查询嵌套在另一个查询内部(可以多层嵌套)。常见于 SELECTFROMWHEREHAVING 等子句中。

下面从基本结构 → 常见用法 → 示例 → 注意事项逐步说明。


一、基本结构

SELECTFROMWHERE 列 操作符 (
    SELECTFROMWHERE 条件
);

子查询先执行,其结果作为外层查询的条件或数据源。


二、常见嵌套方式

1️⃣ 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'
);

2️⃣ SELECT 中的嵌套子查询

SELECT 
    name,
    (SELECT COUNT(*)
     FROM orders o
     WHERE o.customer_id = c.id) AS order_count
FROM customer c;

⚠️ 子查询必须返回单行单列


3️⃣ FROM 中的嵌套子查询(派生表)

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;

✅ 子查询必须起别名


4️⃣ HAVING 中的嵌套子查询

SELECT department_id, AVG(salary)
FROM employee
GROUP BY department_id
HAVING AVG(salary) > (
    SELECT AVG(salary)
    FROM employee
);

5️⃣ 多层嵌套(子查询里再套子查询)

SELECT name
FROM employee
WHERE department_id IN (
    SELECT id
    FROM department
    WHERE manager_id = (
        SELECT id
        FROM manager
        WHERE name = 'Tom'
    )
);

三、相关子查询(Correlated Subquery)

子查询依赖外层查询的值:

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

✅ 外层每读一行,子查询执行一次


四、写嵌套子查询的注意事项

  1. 子查询必须用括号 () 包裹
  2. WHERE 子查询:
    • 单行 → 可用 = > <
    • 多行 → 用 IN / ANY / ALL
  3. FROM 子查询必须起别名
  4. 避免不必要的嵌套(可用 JOIN 优化)
  5. 相关子查询性能较差,数据量大时要谨慎

五、子查询 vs 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';

如果你愿意,可以告诉我:

  • 使用的数据库(MySQL / Oracle / SQL Server / PostgreSQL)
  • 具体业务场景

我可以帮你直接写一条可用的嵌套子查询 SQL

向AI问一下细节

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

AI