1:语法格式
select [columns] from table_name [where..] group by [columns] [having …]
注意:需要说明的是,在select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中!
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 条件过滤出特定的组,也可以使用多个分组标准进行分组。
group by 后面跟哪个字段 则就会过滤掉重复的数据。某些情况下和distinct 相似。
所以过滤掉重复的值也可以用 group by 语句
例如:SELECT externOrderKey,storerKey FROM lf_pos_indepot201808 GROUP BY externOrderKey
distinct 多列:
可以多列,不过经常不是我们想要的效果,
单列绝对没问题,两列的话就是以两列为基准的而不是一列列的基准。
比如两列有这些数据
1 2
1 2
2 1
2 2
那么distinct两列出来的就是
1 2
2 1
2 2
并不是我们所想要的
1 1
2 2
如果 值对某一个字段进行去重 ,又要查出其他字段,则就需要用到 group by 进行分组
如 SELECT externOrderKey, storerKey FROM lf_pos_indepot201808 GROUP BY externOrderKey
对externOrderKey 进行去重复
对多列组合去重复 用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
查询效果一样