zoukankan      html  css  js  c++  java
  • 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表示的含义:按年龄分组统计每个年龄的老师数量,执行结果:

    age group_count
    25 2
    26 2
    27 1
    28 1
    29 1

    再来看一个例子:

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

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

    name max min
    xiaohei 20 29
    xiaohong 28 26
    xiaolan 67 56

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

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

    执行结果

    age count
    25 2
    26 2

    对分组结果进行过滤,只检索出分组中年龄小于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必知必会》

  • 相关阅读:
    gitlab
    MySQL千万级别大表,你要如何优化?
    kafka入门
    zookeeper的原理和应用
    MySQL 性能优化之慢查询
    Redis一些新的看法
    mysql 数据库锁
    MYSQL查看进程和kill进程
    hadoop批量命令脚本xcall.sh及jps找不到命令解决
    java stream 处理分组后取每组最大
  • 原文地址:https://www.cnblogs.com/lxyit/p/9319354.html
Copyright © 2011-2022 走看看