SQL系列(八)—— 分组(group by)

在很多场景时,需要对数据按照某条件进行分组统计其数量、平均值等等。有这种需求,SQL自然也有解决方式。

在SQL中通过group by子句对结果按某条件进行分组。语法:

select count(column1), columnJ from table_name group by columnJ;

group by是后接检索的列或者表达式。表示对该列或者表达式的数据进行分组,该列上或者表达式相同的数据放在同一组。

group by使用的注意点:

  • group by必须作用在检索列上或者表达式上
  • group by可以作用在多个列上,会按照列的顺序,进行逐层分组
  • group by后的列是select的子句中的检索列或者表达式
  • group by会将列为NULL值的作为一组

注:大多数情况的场景都是使用group by进行分组,然后对分组的数据进行聚合统计。很少是分组后取某组中的个别列的数据。如:

select name, age from teacher group by age;

select子句中包含了非聚合的列name(这属于取分组结果中个别列的数据情况)。
在Mysql中默认模式:ONLY_FULL_GROUP_BY下,如果执行以上SQL会报错;可以将其关闭,如果再执行以上SQL,mysql将会取分组中的每组的第一行数据作为结果集。

通过看下面的示例,来熟悉下group by:

select age, count(name) as group_count from teacher group by age;

以上的SQL表示的含义:按年龄分组统计每个年龄的老师数量,执行结果:

agegroup_count
252
262
271
281
291

再来看一个例子:

select name, max(age), min(age) from person group by name;

以上SQL表示,按照姓名分组统计,找出每组中最大年龄,最小年龄的人,执行结果如下

namemaxmin
xiaohei2029
xiaohong2826
xiaolan6756

以上的例子足以理解group by。group by即对结果集进行按条件进行分组,然后常进行聚合处理。
但是往往仍需要对分组后的结果进行过滤处理,SQL中使用另外一个子句HAVING对group by的分组结果进行过滤处理,如下:

select age, count(name) as group_count from teacher group by age having age < 27;

执行结果

agecount
252
262

对分组结果进行过滤,只检索出分组中年龄小于27的组。

在看到having时,不免联系到where子句,下面总结下他们的异同点:

相同点1.having和where都是对结果按照条件过滤;
2.在使用where的地方都可以使用having(不常用);
不同点1.针对的过滤数据不一样,having主要是用来过滤分组,where主要是过滤表中数据行;
2.having和where子句的位置不一样,having在group by后,where在from子句后;
3.having通常配合group by使用;

那么在有having过滤情况下是否还能使用where呢?
根据上表中不同点1可以看出,是可以的。where是对数据行过滤,然后再对过滤后的行进行分组,再对分组进行having过滤。

下表列出了SQL的执行顺序:

子句说明使用场景
select查询数据在db数据检索时使用
from检索的表检索时使用
where过滤数据的条件需要对数据进行筛选时
gropu by分组select的结果集需要聚合统计时常用
having过滤分组对分组进行过滤时需要
order by排序结果集需要按照某种顺序展示数据
参考

《SQL必知必会》

转载于:https://www.cnblogs.com/lxyit/p/9319354.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值