子查询
逻辑上讲:子查询会为外部查询的每行计算一次
--题目:查询出所有订单都是美国国籍职员处理过的,且每个美国国籍职员都为他服务过的客户
SELECT o.CustomerID,
COUNT(o.OrderID) AS 订单数
FROM Orders AS o
INNER JOIN Employees AS e
ON e.EmployeeID = o.EmployeeID
AND e.Country = N'USA'
GROUP BY
o.CustomerID
--筛选出被美国职员处理过的订单的信息
--DISTINCT o.EmployeeID针对GROUP BY步骤后的虚拟表中的EmployeeID进行去重、筛选
HAVING COUNT(DISTINCT o.EmployeeID) = (
SELECT COUNT(*)
FROM Employees AS e2
WHERE e2.Country = N'USA'
)
--筛选出所有订单都是美国国籍的员工处理的,并且每个员工都至少为其服务过一次的顾客
ORDER BY
'订单数'
关键点:
1、HAVING后的筛选条件:having会对分组后的每一组进行运算加筛选
2、DISTINCT的用法:针对上一步虚拟表进行运算
还有一种类似的查询,实现不同的效果
--只要最大EmployeeID编号与最小的EmployeeID编号相等,则说明为该名顾客处理过订单的USA工作人员只有一个
HAVING MIN(o.EmployeeID)=MAX(o.EmployeeID)