zoukankan      html  css  js  c++  java
  • 带你了解数据库中group by的用法

    前言

    本章主要介绍数据库中group by的用法,也是我们在使用数据库时非常基础的一个知识点。并且也会涉及Join的使用,关于Join的用法,可以看我写的上一篇文章:带你了解数据库中JOIN的用法 如有错误还请大家及时指出~

    以下都是采用mysql数据库

    Group By

    概念

    Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。
    作用:通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

    注意:group by 是先排序后分组!

    语法

    SELECT expression1, expression2, ... expression_n, 
           aggregate_function (aggregate_expression)
    FROM tables
    [WHERE conditions]
    GROUP BY expression1, expression2, ... expression_n
    [ORDER BY expression [ ASC | DESC ]];
    

    语法说明

    expression1,expression2,... expression_n
    表达式未封装在聚合函数中,必须包含在SQL语句末尾的GROUP BY子句中。

    aggregate_function
    这是一个聚合函数,例如SUM,COUNT,MIN,MAX或AVG函数。

    aggregate_expression
    这是将使用aggregate_function的列或表达式。

    tables
    您希望从中检索记录的表。FROM子句中必须至少列出一个表。

    where
    可选的。这些是要选择的记录必须满足的条件。

    ORDER BY表达式
    可选的。用于对结果集中的记录进行排序的表达式。如果提供了多个表达式,则值应以逗号分隔。

    ASC
    可选的。ASC按表达式按升序对结果集进行排序。如果没有修饰符是提供者,则这是默认行为。

    DESC
    可选的。DESC按表达式按降序对结果集进行排序。

    常用聚合函数

    • count() 计数
    • sum() 求和
    • avg() 平均数
    • max() 最大值
    • min() 最小值

    举例

    我们以下面两张表举例:

    学生表(Student)

    ID StudentName StudentClassID
    1 小明 1
    2 小红 2
    3 小兰 3
    4 小吕 2
    5 小梓 1

    班级表(Class)

    ClassID ClassName
    1 软件一班
    2 软件二班
    3 软件三班
    • 计算每个班都有多少学生?

    SELECT cl.ClassName,COUNT(stu.StudentClassID) AS studentNum
    FROM student stu LEFT JOIN class cl ON stu.StudentClassID = cl.ClassID
    GROUP BY cl.ClassName;


    计算结果:

    ClassName StudentName
    软件一班 2
    软件二班 2
    软件三班 1

    HAVING

    • HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。
    • HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。
      通俗的说:WHERE过滤行,HAVING过滤组

    语法

    SELECT expression1, expression2, ... expression_n, 
           aggregate_function (aggregate_expression)
    FROM tables
    [WHERE conditions]
    GROUP BY expression1, expression2, ... expression_n
    

    语法说明

    HAVING condition
    这是另一个条件,仅应用于聚合结果以限制返回行的组。只有那些条件评估为TRUE的组才会包含在结果集中。

    举例

    采用上面两张数据表

    • 查询学生人数大于2人的班级?

    SELECT cl.ClassName,COUNT(stu.StudentClassID) AS studentNum
    FROM student stu LEFT JOIN class cl ON stu.StudentClassID = cl.ClassID
    GROUP BY cl.ClassName
    HAVING COUNT(stu.StudentClassID)>=2;


    计算结果:

    ClassName StudentName
    软件一班 2
    软件二班 2

    小结

    • 当group by 与聚合函数配合使用时,功能为分组后计算
    • 当group by 与 having配合使用时,功能为分组后过滤,获得满足条件的分组的返回结果。
    • having与where区别:where过滤行,having过滤组

    文末

    欢迎关注个人微信公众号:Coder编程
    获取最新原创技术文章和免费学习资料,更有大量精品思维导图、面试资料、PMP备考资料等你来领,方便你随时随地学习技术知识!
    新建了一个qq群:315211365,欢迎大家进群交流一起学习。谢谢了!也可以介绍给身边有需要的朋友。

    文章收录至
    Github: https://github.com/CoderMerlin/coder-programming
    Gitee: https://gitee.com/573059382/coder-programming
    欢迎关注并star~
    微信公众号

    推荐阅读

    带你了解数据库中JOIN的用法

    一篇让你理解进程与线程的区别与联系

    一篇带你读懂TCP之“滑动窗口”协议

    参考文章:

    https://www.techonthenet.com/sql/having.php

    https://www.techonthenet.com/sql/group_by.php

    https://www.cnblogs.com/8335IT/p/5850531.html

  • 相关阅读:
    AlphaGo的前世今生(三)AlphaGo Zero: AI Revolution and Beyond
    AlphaGo的前世今生(二)AlphaGo: Countdown to AI Revolution
    AlphaGo的前世今生(一)Deep Q Network and Game Search Tree:Road to AI Revolution
    Exception starting filter [Tongweb WebSocket (JSR356) Filter
    spring boot 集成 redis 出现 “Unable to connect to localhost:6379”
    对女性友好的编程语言
    Git(1)
    js里面看一个字符串的汉字的个数
    celery使用的一些小坑和技巧(非从无到有的过程)
    永远相信美好的事情即将发生。
  • 原文地址:https://www.cnblogs.com/coder-programming/p/10673986.html
Copyright © 2011-2022 走看看