嵌套查询(也叫子查询,Subquery)是指在一条 SQL 语句中嵌套另一条查询语句。之所以要用嵌套查询,主要有以下几方面原因:
很多时候,我们想要的筛选条件本身需要先查一次数据库。
例子:查询“工资高于平均工资的员工”
SELECT name
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
如果没有嵌套查询,就必须先算平均工资,再写死到代码或 SQL 里,不够灵活。
嵌套查询可以把一个复杂问题拆成多个小问题,一步步解决。
例子:查询“购买了最贵商品的用户”
SELECT user_id
FROM orders
WHERE product_id = (
SELECT id
FROM product
WHERE price = (SELECT MAX(price) FROM product)
);
逻辑清晰:先找最高价 → 再找对应商品 → 最后找买的人。
有些场景用子查询比 JOIN 更直观,尤其是不需要返回关联表字段时。
例子:查询“有订单的用户”
SELECT name
FROM user
WHERE id IN (
SELECT user_id FROM orders
);
相比 JOIN,语义更直接:“用户在订单里存在”。
嵌套查询可以进行多层聚合或过滤,比如:
SELECT dept_id
FROM (
SELECT dept_id, COUNT(*) AS cnt
FROM employee
GROUP BY dept_id
) t
WHERE cnt > 10;
(这种叫派生表 / 内联视图)
判断“是否存在”这类业务,嵌套查询非常自然。
SELECT name
FROM user u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
嵌套查询的本质价值是:用“查询结果”作为“查询条件”,从而把复杂问题分步解决。
如果你愿意,我也可以对比 嵌套查询 vs JOIN 的优劣,或结合你正在用的数据库(MySQL / Oracle / PostgreSQL)讲具体写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。