格式
为了结果有意义,分组查询一般和分组函数一起使用。
select avg(age),name # 这个字段需要在后面 group by 出现 from spark.user [where 子句] group by name [order by 子句] ;
统计每个分组行数
select count(*),name from spark.user group by name; -------------- count(*)|name | --------|----------| 1|Bigdataboy| 2|Black | 2|Bob |
分组前过滤
关键字
where
,位置在group by 前面
。
需要过滤的数据在原始表
里就在分组前过滤。
格式
select 字段 from 表 where 过滤条件 group by 分组
分组后过滤
关键字
having
,位置在group by 后面
。
需要过滤的数据是在分组后产生
,就分组后过滤。
格式
select 字段 from 表 group by 分组 having 过滤 条件
通过函数、表达式 分组
其实MySQL是可以在 group by 语句后使用别名
的,但其他数据库就可能不支持。
# 先通过 email的长度 进行分组,然后再统计 name 的列数。 select count(*),name from spark.`user` group by length(email)
多个字段分组
分组有多个字段时,是按照多个字段的值
相同分一组。
查询数据
Id|name |age|email|
--|----------|---|-----|
1|Bigdataboy|18 |aaa |
2|Bob |17 |aaa |
3|Black |18 |bbb |
4|Black |16 |bbb |
5|Bob |16 |bbb |
6|Bob |16 |aaa |
7|Bob |17 |aaa |
按照 name,email 两个字段分组
select count(*),name,email from spark.`user` group by name ,email; #--------------------------# count(*)|name |email| --------|----------|-----| 1|Bigdataboy|aaa | 2|Black |bbb | 3|Bob |aaa | 1|Bob |bbb |