Day-9:分组数据
1、数据分组
分组可以把数据分为多个逻辑组,对每个组进行聚集计算。
2、创建分组
分组是使用select语句的group by子句建立的。
select vend_id, count(*) as num_prods from products group by vend_id; /* vend_id num_prods BRS01 3 DLL01 4 FNG01 2 */
分析:
select语句指定了两个列:vend_id包含产品供应商的ID,num_prods为计算字段。
group by子句指示DBMS按vend_id排序并分组数据,会对每个vend_id而不是整个
表计算num_prods一次。从输出看出,供应商BRS01有3个产品,供应商DLL01有4
个商品,FNG01有2个产品。
使用group by重要规定:
group by子句可以包含任命数目的列,可以对分组进行嵌套。
如果在group by子句中嵌套了分组,数据将在最后指定的分组上进行汇总。(指定的所有列一起计算,所以不能从个别的列取回数据)
group by子句中列出的每一列都必须是检索列或有效表达式,且不能是聚集函数。如果在select中使用表达式,则必须在group by子句中指定相同的表达式,不能用别名。
除聚集计算语句外,select语句中的每一列都必须在group by 子句中给出。
如果分组中有NULL值的行,则作为一个分组返回,如果列中有多行NULL值,它将分为一组.
group by子句必须出现在where子句之后,order by之前。
3、过滤分组
having子句(支持所有where操作符)
select cust_id, count(*) as orders from orders group by cust_id having count(*) >= 2; /* cust_id orders 1000000001 2 */
说明:having与wher的区别
where在分组前进行过滤,having在分组后进行过滤,使用having时应结合group by一起。
select vend_id, count(*) as num_prods from products where prod_price >= 4 group by vend_id having count(*) >= 2; /* vend_id num_prods BRS01 3 FNG01 2 */
4、分组(group by)与排序(order by)
order by对输出排序
group by:对行分组,但输出可能不是分组的排序
5、select子句顺序
子句 | 说明 | 是否必须使用 |
select | 要返回的列或表达式 | 是 |
from | 检索数据的表 | 仅在从表中检索数据时使用 |
where | 行级过滤 | 否 |
group by | 分组说明 | 仅在按组计算聚集时使用 |
having | 组级过滤 | 否 |
order by | 输出排序顺序 | 否 |