在数据库(以 SQL 为例)中,Subquery(子查询)是指嵌套在另一条 SQL 语句中的查询。下面按常见使用场景系统说明,什么时候该用子查询,以及典型写法示例。
场景:
条件值不能直接写死,需要从另一张表算出来。
SELECT *
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE city = 'Beijing'
);
✅ 适合:
场景:
每一行都需要一个“基于其他表的聚合值”。
SELECT
customer_id,
(SELECT COUNT(*)
FROM orders o
WHERE o.customer_id = c.customer_id) AS order_count
FROM customers c;
✅ 适合:
场景:
先算出一个“中间结果集”,再继续查。
SELECT avg_amount
FROM (
SELECT customer_id, AVG(amount) AS avg_amount
FROM orders
GROUP BY customer_id
) t
WHERE avg_amount > 1000;
✅ 适合:
场景:
分组后的过滤条件依赖子查询。
SELECT customer_id
FROM orders
GROUP BY customer_id
HAVING SUM(amount) > (
SELECT AVG(amount)
FROM orders
);
场景:
判断“是否存在关联数据”。
SELECT *
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);
✅ 比 IN 更适合大表
场景:
批量更新或删除依赖其他表。
UPDATE orders
SET status = 'expired'
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_login < '2023-01-01'
);
| 场景 | 推荐 |
|---|---|
| 只判断“是否存在” | EXISTS |
| 需要多列、大结果 | JOIN |
| 行级计算 | 子查询 |
| 分组后再过滤 | 子查询 / CTE |
❌ 子查询导致多次执行(相关子查询慢)
❌ 可用 JOIN 简化逻辑
❌ 超复杂嵌套(可读性差)
子查询适合:条件依赖、行级计算、存在性判断、复杂中间结果
如果你有具体业务场景(订单 / 用户 / 报表),我可以直接帮你写最优 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。