前言

本章主要介绍数据库中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

带你了解数据库中group by的用法的更多相关文章

  1. 带你了解数据库中事务的ACID特性

    前言 前面我们介绍过数据库中 带你了解数据库中JOIN的用法 与 带你了解数据库中group by的用法的相关用法.本章节主要来介绍下数据库中一个非常重要的知识点事务,也是我们项目中或面试中经常会遇到 ...

  2. java中list集合的内容,如何使用像数据库中group by形式那样排序

    java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    mone ...

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

    前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 本章主要介绍数据库中Join的的用法,也是我们在使用数据库时非常基础的一个知识点.本次会介绍数据库 ...

  4. Oracle数据库中序列(SEQUENCE)的用法详解

    Oracle数据库中序列(SEQUENCE)的用法详解   在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...

  5. sql server数据库中raiserror函数的用法

    server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误可以被程序捕捉到. raiserror的常用格式如下:ra ...

  6. SQL中group by的用法

    group by即按照给定字段对结果集进行分组,从字面意义上理解就是根据"by"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个" ...

  7. mysql中group by 的用法解析

    1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 假设现有数据库表如下 ...

  8. mysql数据库中case when 的用法

    场景1:比如说我们在数据库存了性别的字段,一般都是存0 和 1 代表男和女   然后我们会得到0和1之后在java中判断 ,很麻烦有么有?其实我们完全可以在sql中判断好之后拿来现成的.就是在sql中 ...

  9. oracle 中GROUP BY的用法

    转自:http://blog.csdn.net/basenet855x/article/details/6694150 问题: select item.itemnum,item.in1,item.in ...

随机推荐

  1. POJ3104 Drying 2017-05-09 23:33 41人阅读 评论(0) 收藏

    Drying Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15604   Accepted: 3976 Descripti ...

  2. Hbase和Hive的异同

    共同点:1.hbase与hive都是架构在hadoop之上的.都是用hadoop作为底层存储 区别:2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBa ...

  3. web.xml文件中context-param、listener、filter、servlet的执行顺序

    首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> ...

  4. sqlserver 实现数据变动触发信息

    1.建立存储过程,功能是动态写入文件中信息,可以在触发器或存储过程调用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create proc [d ...

  5. Android-Java-了解编译

    在多年以前,计算机早期的运行方式是 01010100 ....., 这种方式的时候,开发人员编写代码是把01010101/01100101/01010111 ..... /来汇编写代码,这种方式特别痛 ...

  6. 使用Linq对Hashtable和Dictionary<T,T>查询的效率比较

    近期做版本迭代任务,有一个在店铺头部展示店主所在的城市名称和省份名称的需求,店主信息表中保存了店主所在的城市Id和省份Id,由于原有业务复杂,要尽量减少Sql执行时间,所以不考虑join城市地区详细表 ...

  7. Java泛型与Restlet客户端

    写一个与restlet服务器通信的客户端类,用于测试通信是否成功,并且进行交互.为了方便其他人使用,于是,写一个通用的方法封装起来,可是中途却放生了一些问题. 按照正常写法,顺序走下来是这样的: pu ...

  8. DI spring.net简单使用

    IOC或DI  spring.net简单使用 一.spring.net是什么? Spring 框架本是 Java 平台上一个应用非常多的.开源的框架.虽然语言是固定的,但是好的方法应该是通用的,于是 ...

  9. Day 36 网络编程-计算机的发展

    手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台计算机诞生 ...

  10. 782. Transform to Chessboard

    An N x N board contains only 0s and 1s. In each move, you can swap any 2 rows with each other, or an ...