• SQL中的grpup by


    原文地址:https://blog.csdn.net/hengji666/article/details/54924387

    练习地址:http://sqlfiddle.com/#!9/ad7c8b/12

    Create table If Not Exists Courses (student varchar(255), class varchar(255));
    Truncate table Courses;
    insert into Courses (student, class) values ('A', 'Math');
    insert into Courses (student, class) values ('B', 'English');
    insert into Courses (student, class) values ('C', 'Math');
    insert into Courses (student, class) values ('D', 'Biology');
    insert into Courses (student, class) values ('E', 'Math');
    insert into Courses (student, class) values ('F', 'Computer');
    insert into Courses (student, class) values ('G', 'Math');
    insert into Courses (student, class) values ('H', 'Math');
    insert into Courses (student, class) values ('I', 'Math');
    select class, count(student) as student
    from courses
    group by class
    having count(student) >= 5
    ;


    我和原博文作者一样,突然间不会用group by了(可能是一直都不会用),就找了一下详解,这篇文章讲的很形象,学习一波

    看一下测试表test
    在这里插入图片描述
    对这个表写group by时,可能就会发生下面这样的怪事:

    select name from test group by name  -- ok
    select * from test group by name --error
    select name,sum(number) from test group by name -- ok 
    
    • 1
    • 2
    • 3

    行吧,接下来一步步的来看。

    1. 单列group by

    对 test表(表1)执行下面语句

    select name from test group by name
    
    • 1

    结果很明显,这是表2
    在这里插入图片描述

    为了能够更好的理解“group by”多个列“和”聚合函数“的应用,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。下面说说如何来思考上面SQL语句执行情况:

    1. from test:sql执行的第一步,找表,这个没啥变化;

    2. from test group by name:没有join 和 where 操作,就是group by了,这时候的过程就如下图所示了,找到name那一列,将具有相同name值的行,合并成同一行。比如nama = aa时,就将<1,aa,2>和<2,aa,3>这两行合并,其它字段(id,number)合并在一个单元格;
      在这里插入图片描述

    3. 接下来就对产生的虚拟表3进行select操作了,这时候就可以看出上面的几句select的问题出在哪了。

    (1)直接 select name 是没问题的,因为group by 的字段就是name,每个单元格只有一个name,某闷忒;

    (2)执行 select * 的话,就是从表3中选择,可是id 和 number 字段中的单元格里的内容有多个值,关系型数据库是不允许这样的,这样就无法形成严格的关系约束条件了,所以会报错;

    那么,对于 id 和 number列咋办呢?聚合函数。

    不知道大家有没有遇到过 aggregator blah blah 之类的报错,我用 group by 的时候就放过这个错,现在想来应该就是 后面用了 group by,却没对字段进行聚合,导致单元格里有多个值。

    聚合函数,就是用来输入多个数据,输出一个数据的,如count(id), sum(number),每个聚合函数的输入就是每一个多数据的单元格。

    因此,这里可以执行

    select name,sum(number) from test group by name
    
    • 1

    那么sum 函数就是对虚拟表3中,每个name对应的number单元格进行sum操作,就可以得到:
    在这里插入图片描述

    2. 对多列进行 group by

    那要是group by 多个字段怎么理解呢, 比如还是在test 表中,group by name,number,此时我们可以将name 和 number 看成一个整体字段,将其作为一个整体来进行判断划分的。如图:
    在这里插入图片描述
    这里只有 <bb, 5>和<cc, 6>是 name 和 number 都相等的,所以将其进行合并,其余并不完全一样,所以没有进行分组合并。

    此时执行以下语句

    select name,sum(id) from test group by name,number
    
    • 1

    就可以得到
    在这里插入图片描述

  • 相关阅读:
    VS插件哪家强?CodeRush v20.2帮你忙
    WinForms界面开发工具DevExpress WinForms v20.2亮点——全新Sankey Diagram控件震撼发布
    java中将信息写入excel
    java中使用IO流将以文件中的内容去取到指定的文件中
    java中使用IO流复制文件
    采购订单写入sap失败后,抛出自定义异常,回滚数据库
    java中将文件夹里面的文件复制到指定的文件夹(java IO)
    JAVA中IO流详解
    获取员工合同信息列表 定时任务
    Java连接MySQL数据库——含步骤和代码
  • 原文地址:https://www.cnblogs.com/shiqi17/p/16251718.html
Copyright © 2020-2023  润新知