Subquery(子查询) 是指嵌套在另一条 SQL 语句中的 SELECT 查询。它通常用于主查询难以直接表达、或需要先算出一个中间结果再使用的场景。下面按常见场景说明,并配简单示例。
当 WHERE 条件的值需要先查出来时。
示例:查询工资高于平均工资的员工
SELECT name, salary
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
判断某字段是否属于一个结果集。
示例:查询购买过商品的用户
SELECT name
FROM user
WHERE id IN (
SELECT user_id
FROM orders
);
常用于“有关联数据才查”的性能友好写法。
示例:查询有订单的用户
SELECT name
FROM user u
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.user_id = u.id
);
先算出一个中间表,再继续查。
示例:查询每个部门平均工资大于 5000 的部门
SELECT dept_id, avg_sal
FROM (
SELECT dept_id, AVG(salary) AS avg_sal
FROM employee
GROUP BY dept_id
) t
WHERE avg_sal > 5000;
子查询依赖外部查询的字段。
示例:查询每个部门工资最高的员工
SELECT name, dept_id, salary
FROM employee e1
WHERE salary = (
SELECT MAX(salary)
FROM employee e2
WHERE e2.dept_id = e1.dept_id
);
有时用子查询比 JOIN 更直观。
SELECT name
FROM user
WHERE id = (
SELECT user_id
FROM profile
WHERE age > 30
LIMIT 1
);
子查询适合:先算中间结果、做存在/集合判断、逻辑清晰优先的场景;性能敏感时优先考虑 JOIN。
如果你有具体业务 SQL,我可以直接帮你判断“该用子查询还是 JOIN”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。