温馨提示×

温馨提示×

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

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

什么场景用Subquery子查询

发布时间:2026-09-26 01:53:48 来源:亿速云 阅读:96 作者:小樊 栏目:数据库

Subquery(子查询) 是指嵌套在另一条 SQL 语句中的 SELECT 查询。它通常用于主查询难以直接表达、或需要先算出一个中间结果再使用的场景。下面按常见场景说明,并配简单示例。


一、用子查询的典型场景

1️⃣ 过滤条件依赖“另一个查询的结果”

当 WHERE 条件的值需要先查出来时。

示例:查询工资高于平均工资的员工

SELECT name, salary
FROM employee
WHERE salary > (
    SELECT AVG(salary)
    FROM employee
);

2️⃣ IN / NOT IN 场景(集合判断)

判断某字段是否属于一个结果集。

示例:查询购买过商品的用户

SELECT name
FROM user
WHERE id IN (
    SELECT user_id
    FROM orders
);

3️⃣ EXISTS / NOT EXISTS(存在性判断)

常用于“有关联数据才查”的性能友好写法。

示例:查询有订单的用户

SELECT name
FROM user u
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.user_id = u.id
);

4️⃣ 作为“虚拟表”使用(FROM 子查询)

先算出一个中间表,再继续查。

示例:查询每个部门平均工资大于 5000 的部门

SELECT dept_id, avg_sal
FROM (
    SELECT dept_id, AVG(salary) AS avg_sal
    FROM employee
    GROUP BY dept_id
) t
WHERE avg_sal > 5000;

5️⃣ 关联子查询(每行都算一次)

子查询依赖外部查询的字段。

示例:查询每个部门工资最高的员工

SELECT name, dept_id, salary
FROM employee e1
WHERE salary = (
    SELECT MAX(salary)
    FROM employee e2
    WHERE e2.dept_id = e1.dept_id
);

6️⃣ 替代 JOIN 的简化写法(可读性好)

有时用子查询比 JOIN 更直观。

SELECT name
FROM user
WHERE id = (
    SELECT user_id
    FROM profile
    WHERE age > 30
    LIMIT 1
);

二、什么时候“不适合”用子查询?

  • 数据量大、关联复杂 → JOIN 通常更快
  • 可改写为 JOIN 的子查询 → 优化器更容易优化
  • 深层嵌套子查询 → 可读性差、难维护

三、一句话总结

子查询适合:先算中间结果、做存在/集合判断、逻辑清晰优先的场景;性能敏感时优先考虑 JOIN。

如果你有具体业务 SQL,我可以直接帮你判断“该用子查询还是 JOIN”。

向AI问一下细节

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

AI
助
手