子查询,是指在查询语句中嵌套查询语句。(这里指的是普通子查询,而非关联子查询)
以下是子查询出现的几种形式:
1,在WHERE子句中的子查询
这种是最常见的普通子查询。如果子查询返回的结果只有1个,那么就称为标量子查询。例如:
SELECT * FROM sales_agents WHERE agency_fee > (SELECT AVG(agency_fee) FROM sales_agents);
如果子查询返回的结果不止1个,那么可以用ALL,ANY关键字,或者用IN,NOT IN,EXISTS,NOT EXISTS关键字进行筛选。例如:
SELECT AVG(agency_fee) FROM sales_agents WHERE id NOT IN (SELECT id FROM managers)
SELECT project_id FROM project GROUP BY project_id HAVING COUNT(employee_id) >= ALL(SELECT COUNT(employee_id) FROM project GROUP BY project_id)
2,在SELECT子句中的子查询
SELECT name, price, (SELECT AVG(price) FROM paintings) AS avg_price FROM paintings
需要注意的是,必须给在SELECT子句中的子查询取别名。
3,在FROM子句中的子查询
也就是把子查询的结果当成一张表,然后在这张新表的基础上再进行后续操作。例如:
SELECT budget FROM department, (SELECT max(budget) as val FROM department) AS max_budget WHERE department.budget = max_budget.val
在这种情况下,更好的做法是把子查询做成一个视图(view),这样比较清晰,还可以复用,修改起来也方便。