在数据库(尤其 SQL)里,Nested Query(嵌套查询 / 子查询)并不是“高级才用”,而是看语义是否天然分层。下面用「什么时候该用」来总结,配例子。
例:找出工资高于平均工资的员工
SELECT name
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
✅ 这里“平均值”必须先算,再比较
❌ 用 JOIN 反而别扭
例:有订单的客户
SELECT name
FROM customers
WHERE EXISTS (
SELECT 1
FROM orders
WHERE orders.cust_id = customers.id
);
或“没有订单的客户”用 NOT EXISTS
✅ 语义清晰:
“只要存在就够,不关心具体值”
例:买过 iPhone 的人
SELECT name
FROM users
WHERE id IN (
SELECT user_id
FROM purchases
WHERE product = 'iPhone'
);
✅ 子查询返回一个“集合”,主查询做匹配
SELECT *
FROM emp e1
WHERE salary = (
SELECT MAX(salary)
FROM emp e2
WHERE e2.dept = e1.dept
);
✅ “每个部门最高薪员工”
SELECT dept, avg_sal
FROM (
SELECT dept, AVG(salary) avg_sal
FROM emp
GROUP BY dept
) t
WHERE avg_sal > 10000;
✅ 先把数据“预处理”成一张临时表
-- 不推荐
SELECT name
FROM users
WHERE id = (SELECT user_id FROM orders WHERE id = 1);
-- 推荐
SELECT u.name
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.id = 1;
WHERE x IN (SELECT ... FROM big_table)
可能比 JOIN 慢很多
“主查询的条件或结果,必须依赖另一个查询先算出来” → 用 Nested Query
否则:
如果你愿意,可以发一段具体 SQL 或业务场景,我可以直接告诉你「该不该嵌套、怎么写最好」。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。