本章介绍如何分组数据,涉及两个新子句:GROUP BY和HAVING
1. 数据分组
上一章已实现在表的所有数据或匹配特定的WHERE子句的数据上进行的
SELECT COUNT(*) AS num_prods
FROM Products
WHERE vend_id = 'DLL01';
2. 创建分组
使用SELECT语句的GROUP BY子句建立分组
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
输出
注意:
3. 过滤分组
SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;
使用HAVING子句实现,HAVING支持所有WHERE操作符,区别在于WHERE过滤行,而HAVING过滤分组;
另一种理解是WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。
WHERE和HAVING可同时使用
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;
4. 分组和排序
ORDER BY和GROUP BY的区别
GROUP BY分组不一定排序,需要添加ORDER BY子句
SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;
注意:Access中不允许按别名排序,可将items替换为实际的计算或字段位置
5. SELECT子句顺序总结