通过分组数据,以便能汇总表内容的子集。涉及两个新SELECT语句子句,分别是GROUP BY 子句和HAVING子句
数据分组
分组允许把数据分为多个逻辑组,以便对每个组进行聚集计算
select product_id,count(*) as num_product #输入
from products
group by product_id
product_id num_product #输出
1001 3
1002 5
1003 7
1005 2
注意【规则】
1、group by子句可以任意包含任意数目的列,使得能对分组进行嵌套
2、如果在group by 字句中嵌套了分组,数据将在最后规定的的分组上进行汇总
使用WITH ROLLUP 关键字,可以得到每隔分组以及每隔分钟汇总级别(针对每个分组)的值
select product_id,count(*) as num_product
from products
group by product_id with rollup;
3、group by 子句中列出的的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group by子句中指定相同的表达式。不能使用别名
4、除聚集计算语句外,select语句中的每个列都必须在group by 子句中给出
5、如果分组列中有null值,则null将作为一个分组返回
6、group by子句必须出现在where子句之后,order by子句之前
过滤分组
WHERE子句的作用是过滤行而不是分组。因此MySQL提供了HAVING子句,它非常类似于WHERE,唯一的差别就是WHERE过滤行,HAVING过滤组。
换种说法,where在数据分组前进行过滤,having在数据分组后进行过滤。也就是where排除的行不在分组中,这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组
select product_id,count(*) as num_product
from products
group by product_id
having count(*)>=4;