温馨提示×

温馨提示×

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

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

哪些场景用Subquery子查询

发布时间:2026-09-05 09:55:17 来源:亿速云 阅读:97 作者:小樊 栏目:数据库

在数据库(以 SQL 为例)中,Subquery(子查询)是指嵌套在另一条 SQL 语句中的查询。下面按常见使用场景系统说明,什么时候该用子查询,以及典型写法示例


一、子查询最常见的 6 类使用场景

1️⃣ 在 WHERE 中做“条件过滤”(最常用)

场景
条件值不能直接写死,需要从另一张表算出来。

SELECT *
FROM orders
WHERE customer_id IN (
    SELECT customer_id
    FROM customers
    WHERE city = 'Beijing'
);

✅ 适合:

  • 依赖其他表的结果做过滤
  • IN / NOT IN / EXISTS

2️⃣ 在 SELECT 中作为“计算列”

场景
每一行都需要一个“基于其他表的聚合值”。

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

✅ 适合:

  • 行级计算
  • 避免 JOIN 导致行数膨胀

3️⃣ 在 FROM 中使用(派生表 / 内联视图)

场景
先算出一个“中间结果集”,再继续查。

SELECT avg_amount
FROM (
    SELECT customer_id, AVG(amount) AS avg_amount
    FROM orders
    GROUP BY customer_id
) t
WHERE avg_amount > 1000;

✅ 适合:

  • 复杂聚合
  • 多层统计

4️⃣ 在 HAVING 中使用

场景
分组后的过滤条件依赖子查询。

SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > (
    SELECT AVG(amount)
    FROM orders
);

5️⃣ 用在 EXISTS / NOT EXISTS(性能友好)

场景
判断“是否存在关联数据”。

SELECT *
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.customer_id
);

✅ 比 IN 更适合大表


6️⃣ 用在 INSERT / UPDATE / DELETE

场景
批量更新或删除依赖其他表。

UPDATE orders
SET status = 'expired'
WHERE customer_id IN (
    SELECT customer_id
    FROM customers
    WHERE last_login < '2023-01-01'
);

二、子查询 vs JOIN 怎么选?

场景 推荐
只判断“是否存在” EXISTS
需要多列、大结果 JOIN
行级计算 子查询
分组后再过滤 子查询 / CTE

三、不适合用子查询的情况

❌ 子查询导致多次执行(相关子查询慢)
❌ 可用 JOIN 简化逻辑
❌ 超复杂嵌套(可读性差)


四、一句话总结

子查询适合:条件依赖、行级计算、存在性判断、复杂中间结果

如果你有具体业务场景(订单 / 用户 / 报表),我可以直接帮你写最优 SQL。

向AI问一下细节

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

AI