在数据库(尤其是 SQL)中,子查询(Subquery)是指嵌套在另一条 SQL 语句中的查询。之所以要用子查询,主要是因为它能解决一些“先查一部分、再用结果做判断或计算”的问题,让 SQL 更直观、灵活。
下面从为什么用和常见场景两方面说明。
很多时候,你需要先用一个查询得到某个值,再基于这个值继续查。
例子:查“工资高于公司平均工资的员工”
不用子查询很难直接写,用子查询就很自然:
SELECT name, salary
FROM employee
WHERE salary > (
SELECT AVG(salary)
FROM employee
);
子查询可以把“计算结果”当成一个临时表或值来用,减少重复代码。
SELECT *
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE city = 'Beijing'
);
如果不使用子查询,可能需要先查客户,再拼 SQL。
子查询往往更贴近“人类思维”:
比多表 JOIN + 条件堆在一起更容易理解(在数据量不大时)。
例如:
SELECT *
FROM employee e
WHERE salary = (
SELECT MAX(salary)
FROM employee
WHERE dept_id = e.dept_id
);
SELECT name,
(SELECT MAX(salary) FROM employee) AS max_salary
FROM employee;
SELECT *
FROM product
WHERE category_id IN (
SELECT id FROM category WHERE type = 'A'
);
判断“是否存在”
SELECT *
FROM customer c
WHERE EXISTS (
SELECT 1
FROM order o
WHERE o.customer_id = c.id
);
SELECT dept_id, avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employee
GROUP BY dept_id
) t
WHERE avg_salary > 10000;
✅ 实际中:
子查询用来“先查一部分结果,再基于结果继续查询”,适合依赖中间结果、逻辑清晰、存在性判断等场景。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。