在数据库(尤其是 SQL)中,子查询(Subquery)是指嵌套在另一个查询中的查询。是否使用子查询,通常取决于逻辑需求、数据关系和性能权衡。下面从「该用」和「不该用」两个角度说明。
当你需要先得到某个聚合或条件结果,再基于它查询时,子查询很自然。
-- 查询工资高于平均工资的员工
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees
);
✅ 适合:条件依赖“动态计算结果”
用 EXISTS / NOT EXISTS 很清晰。
-- 查询下过订单的客户
SELECT name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.customer_id = c.id
);
✅ 适合:判断“有没有关联数据”
例如:每个部门工资最高的员工
SELECT e.*
FROM employees e
WHERE (e.dept_id, e.salary) IN (
SELECT dept_id, MAX(salary)
FROM employees
GROUP BY dept_id
);
✅ 适合:分组极值问题
有时候子查询比多表 JOIN 更容易理解。
SELECT *
FROM (
SELECT *, RANK() OVER (ORDER BY score DESC) AS rk
FROM students
) t
WHERE rk <= 3;
✅ 适合:分步计算、中间结果清晰
-- 不推荐
SELECT name
FROM customers
WHERE id IN (SELECT customer_id FROM orders);
-- 推荐
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.id;
❌ 子查询可能导致重复扫描
-- 每一行都执行一次子查询,很慢
SELECT name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id)
FROM customers c;
✅ 改用 JOIN + GROUP BY
现代数据库更推荐:
ROW_NUMBER() / RANK() / SUM() OVER ()
比“相关子查询”快得多。
用子查询当:逻辑依赖中间结果、存在性判断、分组极值、可读性优先
避免子查询当:能用 JOIN、窗口函数、且数据量大时
如果你有具体 SQL 场景,我可以帮你判断“该不该用子查询”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。