SQL---子查询(subquery)

子查询,是指在查询语句中嵌套查询语句。(这里指的是普通子查询,而非关联子查询)

以下是子查询出现的几种形式:

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),这样比较清晰,还可以复用,修改起来也方便。

原文地址:https://www.cnblogs.com/HuZihu/p/14454791.html