第八章 - 数据分组 group by
- 数据分组
- 过滤分组 having
- 分组排序
- groub by语句的一些规定
- select语句顺序
数据分组
- 在使用group by进行分组时,一般都会配合聚合函数一起使用,实现统计数据的功能。
- 比如下面例子,需要按性别计算人数。按性别进行分组然后通过count()函数来计算每个性别有多少条数据。
selectsex as `性别`,count(sex) as `人数`
fromtest.titanic
group bysex
- 在比如计算不同性别中年龄最大的是多少,年龄最小的是多少,年龄平均值是多少(保留两位小说)。
round(x,y)
为保留小数位数函数,括号内两个参数,逗号左边的x表示传入的具体数值,逗号右边的y表示要保留小数的位数是几位。小数采用四舍五入。
selectsex as `性别`,max(age) as `最高年龄` ,min(age) as `最小年龄`,# 计算均值并保留两位小数round(avg(age),2) as `平均年龄`
fromtest.titanic
group bysex
过滤分组 having
- having 非常类似与 where,由于where的执行优先级要高于group by,要实现group by分组之后再过滤就需要用到having来进行分组过滤了。
- 下面例子实现,票价Fare,卖出去5张以上的票都有哪些且卖出去的多少张。
select
Fare,
count(Fare)
from
test.titanic
group by
Fare
having
count(Fare) > 5
分组排序
- 再前面的例子中输出的结果是没有排序的,所以看起来有些麻烦,而且也不能就这么把数据给别人看。如果在分组过滤后再把得出的结果进行排序,哪看起来就会舒服一些。
- 如何实现分组排序呢,只需要再后面再添加order by进行排序就可以了,如下
selectFare,count(Fare) as `数量`
fromtest.titanic
group byFare
havingcount(Fare) > 5
order by# 对结果进行倒序排列`数量` desc
- 在order by中可以直接使用
as
设置的别名。
groub by语句的一些规定
group by
语句可以包含任意数目的列。- 如果使用了多个列的分组,在建立分组时,指定的所有列都一起计算,不能从个别的列取回数据。
- 使用
group by
分组时,每个列都必须是有效的列名或是有效的表达式(不能是聚合函数),如果在select
中使用表达式,那么在group by
中必须指定相同的表达式,不能使用别名。 - 除了聚合函数计算语句外,
select
语句中的每个列都必须在group by
语句中给出。 - 如果分组列中具有
null
值,则null
将作为一个分组返回,如果类中有多行null
值,他们将分为一组。 group by
必须出现在where
之后,order by
之前。
select语句顺序
在使用select查询语句时,系统执行时遵循下面的次序,次序不对系统就会报错无法执行查询。
- select
- from
- where
- group by
- having
- order by
- limit