带你了解数据库中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 ...
随机推荐
- 反编译 轻松调频 Android APP 下载“飞鱼秀”录音
经常听“飞鱼秀”,但是由于时间的原因,只能听回放,但是轻松调频的APP做的有点儿... 听回放的时候经常会中断,还不能拖动进度条,就决定把录音下载下来听. 1.反编译apk(Android反编译过程见 ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- POJ3104 Drying 2017-05-09 23:33 41人阅读 评论(0) 收藏
Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15604 Accepted: 3976 Descripti ...
- java线程一
我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread).线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比 ...
- jQuery插件开发的五种形态小结
关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...
- Redis连接异常
1. 以指定配置文件启动Redis,否则配置的东西不生效 redis-cli shutdown 关闭 $ redis-server ./redis.conf 2.连接异常 redis.conf 配置文 ...
- BitAdminCore框架应用篇:(四)核心套件querySuite按钮功能
索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...
- ASP.NET Core学习总结(1)
经过那么长时间的学习,终于想给自己这段时间的学习工作做个总结了.记得刚开始学习的时候,什么资料都没有,光就啃文档.不过,值得庆幸的是,自己总算还有一些Web开发的基础.至少ASP.NET的WebFor ...
- VisualStudio、NETFramework及C#版本关系
1.Visual Studio..NET Framework 及C#版本搭载关系介绍 Visual Studio版本 .NET Framework版本 C#版本 增加功能 Visual Studio ...
- 网易郑栋:数据采集与分析的那些事——从数据埋点到AB测试
本文由 网易云发布. 4月8日晚,DTalk邀请到了网易互联网分析产品.可视化 BI 产品的负责人—郑栋老师,进行了一次关于<网易郑栋:数据采集与分析的那些事第一弹: 数据篇>的主题分享 ...
