美文网首页
MySql查询-分组

MySql查询-分组

作者: GaoYuan117 | 来源:发表于2020-03-20 17:19 被阅读0次

    group by

    1. group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组
    2. group by可用于单个字段分组,也可用于多个字段分组
    select * from students;
    +----+-----------+------+--------+--------+--------+-----------+
    | id | name      | age  | height | gender | cls_id | is_delete |
    +----+-----------+------+--------+--------+--------+-----------+
    |  1 | 小明      |   18 | 180.00 | 女     |      1 |           |
    |  2 | 小月月    |   18 | 180.00 | 女     |      2 | �         |
    |  3 | 彭于晏    |   29 | 185.00 | 男     |      1 |           |
    |  4 | 刘德华    |   59 | 175.00 | 男     |      2 | �         |
    |  5 | 黄蓉      |   38 | 160.00 | 女     |      1 |           |
    |  6 | 凤姐      |   28 | 150.00 | 保密   |      2 | �         |
    |  7 | 王祖贤    |   18 | 172.00 | 女     |      1 | �         |
    |  8 | 周杰伦    |   36 |   NULL | 男     |      1 |           |
    |  9 | 程坤      |   27 | 181.00 | 男     |      2 |           |
    | 10 | 刘亦菲    |   25 | 166.00 | 女     |      2 |           |
    | 11 | 金星      |   33 | 162.00 | 中性   |      3 | �         |
    | 12 | 静香      |   12 | 180.00 | 女     |      4 |           |
    | 13 | 周杰      |   34 | 176.00 | 女     |      5 |           |
    | 14 | 郭靖      |   12 | 170.00 | 男     |      4 |           |
    +----+-----------+------+--------+--------+--------+-----------+
    
    select gender from students group by gender;
    +--------+
    | gender |
    +--------+
    | 男     |
    | 女     |
    | 中性   |
    | 保密   |
    +--------+
    
    

    根据gender字段来分组,gender字段的全部值有4个'男','女','中性','保密',所以分为了4组 当group by单独使用时,只显示出每组的第一条记录, 所以group by单独使用时的实际意义不大

    group by + group_concat()

    1. group_concat(字段名)可以作为一个输出字段来使用,
    2. 表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
    select gender from students group by gender;
    +--------+
    | gender |
    +--------+
    | 男     |
    | 女     |
    | 中性   |
    | 保密   |
    +--------+
    
    select gender,group_concat(name) from students group by gender;
    +--------+-----------------------------------------------------------+
    | gender | group_concat(name)                                        |
    +--------+-----------------------------------------------------------+
    | 男     | 彭于晏,刘德华,周杰伦,程坤,郭靖                                 |
    | 女     | 小明,小月月,黄蓉,王祖贤,刘亦菲,静香,周杰                        |
    | 中性   | 金星                                                       |
    | 保密   | 凤姐                                                       |
    +--------+-----------------------------------------------------------+
    
    select gender,group_concat(id) from students group by gender;
    +--------+------------------+
    | gender | group_concat(id) |
    +--------+------------------+
    | 男     | 3,4,8,9,14       |
    | 女     | 1,2,5,7,10,12,13 |
    | 中性   | 11               |
    | 保密   | 6                |
    +--------+------------------+
    
    

    group by + 集合函数

    1. 通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个值的集合做一些操作
    select gender,group_concat(age) from students group by gender;
    +--------+----------------------+
    | gender | group_concat(age)    |
    +--------+----------------------+
    | 男     | 29,59,36,27,12       |
    | 女     | 18,18,38,18,25,12,34 |
    | 中性   | 33                   |
    | 保密   | 28                   |
    +--------+----------------------+
    
    分别统计性别为男/女的人年龄平均值
    select gender,avg(age) from students group by gender;
    +--------+----------+
    | gender | avg(age) |
    +--------+----------+
    | 男     |  32.6000 |
    | 女     |  23.2857 |
    | 中性   |  33.0000 |
    | 保密   |  28.0000 |
    +--------+----------+
    
    分别统计性别为男/女的人的个数
    select gender,count(*) from students group by gender;
    +--------+----------+
    | gender | count(*) |
    +--------+----------+
    | 男     |        5 |
    | 女     |        7 |
    | 中性   |        1 |
    | 保密   |        1 |
    +--------+----------+
    
    

    group by + having

    1. having 条件表达式:用来分组查询后指定一些条件来输出查询结果
    2. having作用和where一样,但having只能用于group by
    select gender,count(*) from students group by gender having count(*)>2;
    +--------+----------+
    | gender | count(*) |
    +--------+----------+
    | 男     |        5 |
    | 女     |        7 |
    +--------+----------+
    
    

    group by + with rollup

    1. with rollup的作用是:在最后新增一行,来记录当前列里所有记录的总和
    select gender,count(*) from students group by gender with rollup;
    +--------+----------+
    | gender | count(*) |
    +--------+----------+
    | 男     |        5 |
    | 女     |        7 |
    | 中性   |        1 |
    | 保密   |        1 |
    | NULL   |       14 |
    +--------+----------+
    
    select gender,group_concat(age) from students group by gender with rollup;
    +--------+-------------------------------------------+
    | gender | group_concat(age)                         |
    +--------+-------------------------------------------+
    | 男     | 29,59,36,27,12                            |
    | 女     | 18,18,38,18,25,12,34                      |
    | 中性   | 33                                        |
    | 保密   | 28                                        |
    | NULL   | 29,59,36,27,12,18,18,38,18,25,12,34,33,28 |
    +--------+-------------------------------------------+
    
    示例:
    -- 分组
        -- group by
        -- 按照性别分组,查询所有性别
        -- 这时的count(*)统计的是分组之后的,每一个组中的信息,所以分组字段要有唯一性
        select gender,count(*) from student group by gender;
    
        -- 计算男性人数
        select gender,count(*) from student where gender=1 group by gender;
    
        -- 查询同种性别中的所有姓名
        select gender,group_concat(name) from student group by gender;
        select gender,group_concat(name,age,id) from student group by gender;
        select gender,group_concat(name,"_",age,"_",id) from student group by gender;
    
        -- having
        -- having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。
        -- 查询平均年龄超过30岁的性别以及姓名
        select gender,group_concat(name) from student group by gender having avg(age)>30;
    
        -- 查询每个性别中的人数多于2个的信息
        select gender,count(*) from student group by gender having count(*)>2;
    
    

    相关文章

      网友评论

          本文标题:MySql查询-分组

          本文链接:https://www.haomeiwen.com/subject/ittsyhtx.html