mysql group by 分组查询

1:语法格式web

select [columns] from table_name [where..] group by [columns] [having …]sql

注意:须要说明的是,在select指定的字段要么就要包含在Group By语句的后面,做为分组的依据;要么就要被包含在聚合函数中!svg

2:Having与Where的区别函数

where 子句的做用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组以前过滤数据,where条件中不能包含聚合函数,使用where条件过滤出特定的行。
例子:
SELECT count(1),externOrderKey FROM lf_pos_indepot201808 GROUP BY externOrderKey HAVING externOrderKey =’153303210423232000’
这句写法不太恰当:externOrderKey =’153303210423232000’ 不该该放在HAVING 后面 ,HAVING后面应该放 聚合函数用来过滤分组后的结果。
正确写法:
SELECT count(1),externOrderKey FROM lf_pos_indepot201808 externOrderKey =’153303210423232000’
GROUP BY externOrderKey ;
若是想用聚合函数:
SELECT count(1),externOrderKey FROM lf_pos_indepot201808 GROUP BY externOrderKey HAVING count(1) > 8;
这句sql 查询 if_pos_indepot 表 根据 externOrderKey 进行分组(查出来的几个是根据externOrderKey 惟一显示 count 显 示相同externOrderKey 的数据总条数。因此是根据externOorderKey 进行分组)。
最后结果:查询if_pos_indepot 中 externOrderKey 值相同且总条数 数量 > 8 的externOrderKey值。
having 子句的做用是筛选知足条件的组,即在分组以后过滤数据,条件中常常包含聚合函数,使用having 条件过滤出特定的组,也可使用多个分组标准进行分组。xml

group by 后面跟哪一个字段 则就会过滤掉重复的数据。某些状况下和distinct 类似。
因此过滤掉重复的值也能够用 group by 语句
例如:SELECT externOrderKey,storerKey FROM lf_pos_indepot201808 GROUP BY externOrderKeyit

distinct 多列:table

能够多列,不过常常不是咱们想要的效果,
单列绝对没问题,两列的话就是以两列为基准的而不是一列列的基准。
好比两列有这些数据
1 2
1 2
2 1
2 2
那么distinct两列出来的就是
1 2
2 1
2 2
并非咱们所想要的
1 1
2 2select

若是 值对某一个字段进行去重 ,又要查出其余字段,则就须要用到 group by 进行分组
如 SELECT externOrderKey, storerKey FROM lf_pos_indepot201808 GROUP BY externOrderKey
对externOrderKey 进行去重复webkit

对多列组合去重复 用distinct + 多个字段 和group by + 多列组合
例如:SELECT DISTINCT externOrderKey,storerKey,sku FROM lf_pos_indepot201808 GROUP BY externOrderKey, type语法

SELECT externOrderKey,effectiveDate,sku FROM lf_pos_indepot201808 GROUP BY externOrderKey,effectiveDate,sku 查询效果同样