温馨提示×

温馨提示×

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

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

为什么要用Subquery子查询

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

在数据库(尤其是 SQL)中,子查询(Subquery)是指嵌套在另一条 SQL 语句中的查询。之所以要用子查询,主要是因为它能解决一些“先查一部分、再用结果做判断或计算”的问题,让 SQL 更直观、灵活。

下面从为什么用常见场景两方面说明。


一、为什么要用子查询

1. 解决“依赖中间结果”的问题

很多时候,你需要先用一个查询得到某个值,再基于这个值继续查。

例子:查“工资高于公司平均工资的员工”

不用子查询很难直接写,用子查询就很自然:

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

2. 避免重复写复杂逻辑

子查询可以把“计算结果”当成一个临时表或值来用,减少重复代码。

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

如果不使用子查询,可能需要先查客户,再拼 SQL。


3. 提高可读性和逻辑清晰度

子查询往往更贴近“人类思维”:

  • 先找什么
  • 再基于结果做什么

比多表 JOIN + 条件堆在一起更容易理解(在数据量不大时)。


4. 有些场景子查询比 JOIN 更自然

例如:

  • 找“每个部门工资最高的员工”
  • 判断“是否存在某条记录”
SELECT *
FROM employee e
WHERE salary = (
    SELECT MAX(salary)
    FROM employee
    WHERE dept_id = e.dept_id
);

二、子查询的常见类型

1. 标量子查询(返回一行一列)

SELECT name,
       (SELECT MAX(salary) FROM employee) AS max_salary
FROM employee;

2. IN / NOT IN 子查询

SELECT *
FROM product
WHERE category_id IN (
    SELECT id FROM category WHERE type = 'A'
);

3. EXISTS / NOT EXISTS

判断“是否存在”

SELECT *
FROM customer c
WHERE EXISTS (
    SELECT 1
    FROM order o
    WHERE o.customer_id = c.id
);

4. FROM 子句中的子查询(派生表)

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

三、子查询的缺点(也要注意)

  • 性能问题:嵌套多层、数据量大时可能慢
  • 有些数据库对子查询优化不好
  • 复杂子查询可读性反而变差

✅ 实际中:

  • 小数据 / 逻辑清晰 → 用子查询
  • 大数据 / 高性能 → 优先考虑 JOIN 或临时表

一句话总结

子查询用来“先查一部分结果,再基于结果继续查询”,适合依赖中间结果、逻辑清晰、存在性判断等场景。

如果你愿意,我也可以:

  • JOIN vs 子查询 对比讲
  • 结合 MySQL / Oracle / PostgreSQL 具体例子
  • 什么时候不要用子查询
向AI问一下细节

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

AI