SQL 分组查询

格式

为了结果有意义,分组查询一般和分组函数一起使用。

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  |
发表评论 / Comment

用心评论~