10.1 数据分组
分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
10.2 创建分组
# GROUP BY 子句指示DBMS按照vend_id 排序并分组数据
select vend_id, count(*) as num_prods
from products
group by vend_id;
10.3 过滤分组
通过HAVING子句
# 过滤出两个以上订单的分组
select cust_id, count(*) as orders
from orders
group by cust_id
having count(*) >= 2;
WHERE 在数据分组前进行过滤,而HAVING 在数据分组之后进行过滤。
# 列出具有两个以上产品且其价格大于等于4的供应商
select vend_id, count(*) as onum_prods
from products
where prod_price >= 4
group by vend_id
having count(*) >= 2
10.4 分组和排序
group by 和 order by 的区别
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;
10.5 select 子句顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |