六、分组数据


6.1 创建分组 group by
group by规定:
1).group by 可以包含任意数目的列,所以可以对分组进行嵌套;
2).若group by 中嵌套了分组,数据将在最后规定的分组上进行汇总;
3).group by 子句中列出的每个列都必须是检索列或有效表达式(不能是聚集函数);
4).如果分组的列中有NULL值,则将NULL作为一个单独分组返回;
5).group by 必须出现在where子句之后,order by子句之前。
>>> select vend_id,count(*) as num from products group by vend_id; #group by子句指按照vend_id分组并排序数据。
>>> select vend_id,count(*) as num from products group by vend_id order by num; #group by子句指按照vend_id分组再按num排序

6.2 过滤分组
where子句过滤的是行,having子句过滤的是分组。
where子句的所用到的技术和句法,having都支持。比如通配符,正则表达式,逻辑运算符等。
where子句在分组前进行过滤,having子句在分组后进行过滤。
>>> select cust_id,count(*) as num from orders group by cust_id having num>=2; #根据cust_id分组后,然后找出每组订单数>=2的数据
>>> select cust_id,count(*) as num from orders where Month(trade_date)='12' and group by num>=2; #先找出12月份的订单,再根据cust_id分组后,然后找出每组订单数>=2的数据

6.3 分组和排序
分组自带排序,但是排序是以 分组的列排序的,若是指定其他的列排序,则需要order by子句
>>> select cust_id,SUM(qty*price) as amount from order group by cust_id having amount>=50; #根据用户分组,计算每个用户消费总额,过滤出总额大于50的客户
>>> select cust_id,SUM(qty*price) as amount from order group by cust_id having amount>=50 order by amount; #根据用户分组,计算每个用户消费总额,过滤出总额大于50的客户,最后按消费总额排序

6.4 子句顺序
目前已经学了where子句,order by子句, group by子句 having子句 limit子句。编写sql语句时各子句顺序如下:
select子句 > #要返回的列或表达式
from > #要检索的表
where子句 > #行级过滤
group by子句 > #分组说明
having子句 > #组级过滤
order by子句> #排序说明
limit子句 #检索的行数




posted @ 2023-04-12 17:54  5250  阅读(41)  评论(0)    收藏  举报