子查询(Subquery,也叫内查询、嵌套查询)是指写在另一个 SQL 语句中的 SELECT 查询。并不是所有场景都必须用子查询,但在下面这些场景中,子查询往往更直观、逻辑更清晰,甚至性能更优。
当你筛选数据的条件,本身需要先查一次表时。
示例:查询工资高于平均工资的员工
SELECT name, salary
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
✅ 适合原因:
使用 EXISTS / NOT EXISTS 是非常典型的子查询场景。
示例:查询下过订单的客户
SELECT name
FROM customer c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);
✅ 适合原因:
比如:
示例:每个部门工资最高的员工
SELECT e.*
FROM employee e
WHERE (e.dept_id, e.salary) IN (
SELECT dept_id, MAX(salary)
FROM employee
GROUP BY dept_id
);
当中间结果需要先聚合或处理时。
示例:先统计销售额,再筛大额
SELECT dept_id, total_sales
FROM (
SELECT dept_id, SUM(amount) AS total_sales
FROM sales
GROUP BY dept_id
) t
WHERE total_sales > 100000;
✅ 适合原因:
示例:删除没有订单的用户
DELETE FROM customer
WHERE id NOT IN (
SELECT customer_id
FROM orders
);
有时 JOIN 会很绕,子查询反而更易懂。
❌ 大表 + correlated subquery(相关子查询)
❌ 可明显用 JOIN 更简单高效时
❌ 子查询被多次执行(性能差)
优化思路:
当“查询结果本身依赖另一次查询”或“逻辑上需要先查再算”时,子查询是最自然的选择。
如果你愿意,可以告诉我你用的数据库(MySQL / PostgreSQL / Oracle)和具体业务场景,我可以帮你判断“该不该用子查询”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。