#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 关键字可以得到分组以及每个分组汇总级别的值

  1. mysql> select vend_id,count(prod_price),count(*)as num_prods from products group by vend_id with rollup;
  2. +---------+-------------------+-----------+
  3. | vend_id | count(prod_price) | num_prods |
  4. +---------+-------------------+-----------+
  5. | 1001 | 3 | 3 |
  6. | 1002 | 2 | 2 |
  7. | 1003 | 7 | 7 |
  8. | 1005 | 2 | 2 |
  9. | NULL | 14 | 14 |
  10. +---------+-------------------+-----------+

#having

having和where的区别
having过滤分组,where过滤行(where在分组之前进行过滤,having在分组之后进行过滤),having支持所有where的操作符

场景:筛选出有两个以上订单的顾客
分解:(1)按顾客分组,统计每个顾客的订单数 group by cust_id
(2)筛选分组,筛选出订单数大于2的分组 having count(*)>= 2

  1. mysql> select cust_id from orders group by cust_id having count(*)>=2;
  2. +---------+
  3. | cust_id |
  4. +---------+
  5. | 10001 |
  6. +---------+

场景:筛选出12个月内具有两个以上订单的顾客
分解:(1)筛选出12个月内的订单 where
(2)订单按顾客分组,统计每个顾客的订单数 group by
(3)筛选分组,筛选出订单数大于2的分组 having

#order by 和group by

不要依赖group by的排序,group by 后面最好使用order by