带你了解数据库中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~
推荐阅读
参考文章:
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的用法的更多相关文章
- 带你了解数据库中事务的ACID特性
前言 前面我们介绍过数据库中 带你了解数据库中JOIN的用法 与 带你了解数据库中group by的用法的相关用法.本章节主要来介绍下数据库中一个非常重要的知识点事务,也是我们项目中或面试中经常会遇到 ...
- java中list集合的内容,如何使用像数据库中group by形式那样排序
java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name mone ...
- 带你了解数据库中JOIN的用法
前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 本章主要介绍数据库中Join的的用法,也是我们在使用数据库时非常基础的一个知识点.本次会介绍数据库 ...
- Oracle数据库中序列(SEQUENCE)的用法详解
Oracle数据库中序列(SEQUENCE)的用法详解 在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...
- sql server数据库中raiserror函数的用法
server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误可以被程序捕捉到. raiserror的常用格式如下:ra ...
- SQL中group by的用法
group by即按照给定字段对结果集进行分组,从字面意义上理解就是根据"by"指定的规则对数据进行分组,所谓的分组就是将一个"数据集"划分成若干个" ...
- mysql中group by 的用法解析
1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 假设现有数据库表如下 ...
- mysql数据库中case when 的用法
场景1:比如说我们在数据库存了性别的字段,一般都是存0 和 1 代表男和女 然后我们会得到0和1之后在java中判断 ,很麻烦有么有?其实我们完全可以在sql中判断好之后拿来现成的.就是在sql中 ...
- oracle 中GROUP BY的用法
转自:http://blog.csdn.net/basenet855x/article/details/6694150 问题: select item.itemnum,item.in1,item.in ...
随机推荐
- jacob将word转换为html
1.导包jacob.jar 2.将下面两个文件复制到C:\Windows\System32路径下 3.代码如下 // 8 代表word保存成html public static final int W ...
- (最小生成树)QS Network -- ZOJ --1586
链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586 http://acm.hust.edu.cn/vjudge/ ...
- How To Use XDOLoader to Manage, Download and Upload Files? (文档 ID 469585.1)
Applies to: BI Publisher (formerly XML Publisher) - Version 5.6.3 to 5.6.3 [Release 5] Information ...
- Python学习-37.Python中的正则表达式
作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...
- redis 任务队列
使用Redis实现任务队列 说到队列很自然就能想到Redis的列表类型,3.4.2节介绍了使用LPUSH和RPOP命令实现队列的概念.如果要实现任务队列,只需要让生产者将任务使用LPUSH命令加入到某 ...
- AndroidPn消息推送
接着前面的工作,消息接收之后,要推送给不同的客户端.关于消息推送,网上有很多方式,http长连接,xmpp协议,还有一个谷歌的貌似叫C2DM的东西. 在此之前,用openfire做了一个小demo,例 ...
- Struts2-057/CVE-2018-11776两个版本RCE漏洞分析(含EXP)
0x01 前言 2018年8月22日,Apache Strust2发布最新安全公告,Apache Struts2存在远程代码执行的高危漏洞(S2-057/CVE-2018-11776),该漏洞由Sem ...
- [ASP.NET]大文件无法上传排查经验分享
最近我们标桥下载模块,在经过正常更新后,发现软件包无法上传. 临时解决方案 因为问题结点在于文件无法上传到服务器,所以我们临时手动将文件丢到服务器,通过测试服务器将数据造出来,然后再更新到正式数据库, ...
- LINQ to objects遇到的小坑
1.C#中LINQ to Objects中延迟查询的陷阱(其他类型的LINQ也基本一致) 之前在不了解LINQ延迟查询的时候,我使用下面的这种方式,将where语句的结果直接as为List<T& ...
- CodeForces 540C Ice Cave (BFS)
http://codeforces.com/problemset/problem/540/C Ice Cave Time Limit:2000MS Memory Limit:262 ...
