当前位置:首页 > 数据库 > mysql中group by和order by到底应该如何用

mysql中group by和order by到底应该如何用

2022年11月09日 23:18:44数据库10

一、group by的原理

  先来看下表1,表名为test:

 

表1

  执行如下SQL语句:

SELECT  name  FROM  test GROUP  BY  name

你应该很容易知道运行的结果,没错,就是下表2:

 

表2

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

1.FROM test:该句执行后,应该结果和表1一样,就是原来的表。

2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行,如对于name值为aa的,那么<1 aa 2>与<2 aa 3>两行合并成1行,所有的id值和number值写到一个单元格里面。

 

3.接下来就要针对虚拟表3执行Select语句了:

(1)如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了。【备注:mysql8已经修复了该问题,隐式排序】

(2)我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。

(3)那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。

(4)例如我们执行select name,sum(number) from test group by name,那么sum就对虚拟表3的number列的每个单元格进行sum操作,例如对name为aa的那一行的number列执行sum操作,即2+3,返回5,最后执行结果如下:

 (5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图

(6)接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:

***二、order by的用法***

使用order by,一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC;降序:DESC;默认为升序)。

当排序列含空值时:

ASC:排序列为空值的元组最后显示。

DESC:排序列为空值的元组最先显示。

为了好记忆,我的理解是,可以把null值看做无穷大,因为不知道具体为多少。然后去考虑排序,asc升序null肯定在最后,而desc降序,null肯定在最前面。(我的想法,轻喷。。。

1》单一列属性排序

举例1:默认排序:

select * from s
mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

select * from s order by sno desc

按照sno降序:

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

2》多个列属性排序

选择多个列属性进行排序,然后排序的顺序是,从左到右,依次排序。

如果前面列属性有些是一样的话,再按后面的列属性排序。(前提一定要满足前面的属性排序,因为在前面的优先级高)。

举例2:

select * from s  
order by sname desc, sage desc


mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

首先按照sname降序排序,然后出现了xx一样的,在按照sage降序排序。(默认sage是升序)。

如果最开始使用sno排序,

select * from s 
order by sno desc,  sage asc

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

必须先满足前面列属性的排序(sno在前优先级高)。才会去考虑后续列属性的排序。

三、group by的用法

group by按照查询结果集中的某一列(或多列),进行分组,值相等的为一组。

1》细化集函数(count,sum,avg,max,min)的作用对象:

未对查询结果分组,集函数将作用于整个查询结果。

对查询结果分组后,集函数将分别作用于每个组。

例子3:

求各个课程号及相应的选课人数:

select cno,count(sno) from sc


mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

对整个表进行count。

select cno,count(sno) from sc group by cno

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

对分组的表进行count

sc表内容如下:

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

2》GROUP BY子句的作用对象是查询的中间结果表

分组方法:按指定的一列或多列值分组,值相等的为一组。

使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性(比如:sno)和集函数(比如:count())。

select sno,count(cno) from sc group by sno

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记


3》多个列属性进行分组 举例:

select cno,grade,count(cno) from sc group by cno,grade

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

cno为1且成绩为66的,有3个


4》使用HAVING短语筛选最终输出结果

只有满足HAVING短语指定条件的组才输出。

HAVING短语与WHERE子句的区别:作用对象不同。

1》WHERE子句作用于基表或视图,从中选择满足条件的元组

2》HAVING短语作用于,从中选择满足条件的

举例:

查询选修了3门以上课程的学生学号:

select sno from sc group by sno having count(cno)>3

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记


举例:

查询选修了3门以上课程,且所有课程成绩都高于60分的学生学号及课程数

select sno , count(cno)
from sc 
where grade > 60  
group by sno having count(cno) > 3

mysql中group by和order by到底应该如何用 _ JavaClub全栈架构师技术笔记

参考文档:1.https://blog.csdn.net/yulutian/article/details/93247203
2.https://blog.csdn.net/jiangxindu1/article/details/48147149?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

作者:nfzhlk
来源链接:https://blog.csdn.net/nfzhlk/article/details/109204159

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68966.html

标签: group byMySQL
分享给朋友:

“mysql中group by和order by到底应该如何用” 的相关文章

Linux安装MySQL(超详细)

Linux安装MySQL(超详细)

1 查看是否已经安装 Mysql rpm -qa | grep mysql 我之前装过一次! 如果你查看出来有东西,可以使用下面命令将其删除 rpm -e 文件名   2 下载官方 Mysq...

MySQL主从复制

MySQL主从复制 文章目录 MySQL主从复制 1.准备工作 2.主库的配置 3.配置从库 4.Sharding-JDBC框架的使用...

mysql之基础查询

mysql之基础查询

文章目录 DQL语言的学习 进阶1:基础查询 1.查询表中的单个字段 2.查询表中的多个字段 3.查询表中的所有字段 4.查询常量值...

mysql 查询数据库内存大小

mysql 查询数据库内存大小

查询某个数据库,指定数据库名:打开information_schema,在它之下查询 select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables whe...

mysql查询结果中文显示成了问号

character-set-server = utf8    collation-server = utf8_general_ci   然后 service  mysq...

mysql查询字段是否包含某个值或某些值的方法

mysql查询字段是否包含某个值或某些值的方法

方法一:SELECT * from demo where type like  "%3%";                字段type中包含3的都查询到了,会导致索...

MYSQL根据日期查询

MYSQL根据日期查询

“风萧萧兮易水寒,壮士一去兮不复还” 总结一下mysql的根据日期查询数据和在日期区间查询数据. 首先,看数据表和表结构 建表语句: CREATE TABLEdatetest( idint(11) NOT NULL AUTO_INCREMENT...

关于mysql数据库连接异常处理

tomcat启动错误日志关键信息: 28-Aug-2019 14:22:55.014 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerB...

MySQL查询小于或大于当天日期的数据

MySQL的有三个关于日期时间的函数,分别是NOW()、CURDATE()、CURTIME() NOW()函数返回当前的日期和时间。 例如:2021-6-10 11:30:04 CURDATE() 函数返回当前的日期。例如:2021-6-10 CURTIME()...

Mysql查询数据时,自动为结果编上序号

Mysql查询数据时,自动为结果编上序号

说明: select @变量名 是定义变量名的方式 select @i:=1     在开始是定义一个变量i,并且递增, 使用select语句对用户变量进行赋值时,只能使用”:=”方式 每次执行查询语句获取结果后需要重置为0,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。