#group by
后面可加多个列
group by 子句中跟的列必须是检索列或有效的表达式(但不能是聚集函数)
select中使用了表达式,group by 中也必须指定相同的表达式(不能使用别名)
除了聚集计算语句外,select中的每个列都要在group by 中给出
分组中列有null值,则null值将作为一个分组返回,若列中有多行null值,它们将被分为一组
group by 出现在where后面,order by 之前
select (列A名),(聚集计算语句)from (某个表)group by (列A名);
—就是先按列A进行分组,然后再用各分组的数据按聚集计算语句进行计算
with rollup 关键字可以得到分组以及每个分组汇总级别的值
mysql> select vend_id,count(prod_price),count(*)as num_prods from products group by vend_id with rollup;+---------+-------------------+-----------+| vend_id | count(prod_price) | num_prods |+---------+-------------------+-----------+| 1001 | 3 | 3 || 1002 | 2 | 2 || 1003 | 7 | 7 || 1005 | 2 | 2 || NULL | 14 | 14 |+---------+-------------------+-----------+
#having
?having和where的区别
having过滤分组,where过滤行(where在分组之前进行过滤,having在分组之后进行过滤),having支持所有where的操作符
场景:筛选出有两个以上订单的顾客
分解:(1)按顾客分组,统计每个顾客的订单数 group by cust_id
(2)筛选分组,筛选出订单数大于2的分组 having count(*)>= 2
mysql> select cust_id from orders group by cust_id having count(*)>=2;+---------+| cust_id |+---------+| 10001 |+---------+
场景:筛选出12个月内具有两个以上订单的顾客
分解:(1)筛选出12个月内的订单 where
(2)订单按顾客分组,统计每个顾客的订单数 group by
(3)筛选分组,筛选出订单数大于2的分组 having
#order by 和group by
不要依赖group by的排序,group by 后面最好使用order by
