MySQL之DQL-分组函数

1、分组函数

1. 分组函数语法

分组函数也叫聚合函数。是对表中一组记录进行操作,每组只返回一个结果。我们只讲如下5个常用的分组函数:

分组函数

含义

MAX

求最大值

MIN

求最小值

SUM

求和

AVG

求平均值

COUNT

求个数

分组函数的语法如下:

SELECT 列名, 分组函数

FROM 表名

WHERE 条件表达式

ORDER BY 列名;

说明:

1、分组函数写在SELECT子句上

2、WHERE、ORDER BY子句可以省略不写

2. MIN函数和MAX函数

MIN和MAX函数主要是返回每组的最小值和最大值,语法如下:

MIN( [ DISTINCT | ALL ] 列名 | 表达式 )

MAX( [ DISTINCT | ALL ] 列名 | 表达式 )

说明:

1、MIN和MAX可以用于任何数据类型

2、DISTINCT表示去掉组中的重复值,ALL表示不去掉重复值,省略不写默认为ALL

3、既可以写列名,也可以写表达式,通常写列名。

4、MIN和MAX函数会忽略掉NULL值后,再进行运算。

例:查询员工入职的最早日期和最晚日期

SELECT  MIN(hiredate), MAX(hiredate) 
FROM    emp;

例:查询最低工资和最高工资

SELECT  MIN(sal), MAX(sal) 
FROM    emp;

3. SUM函数和AVG函数

SUM和AVG函数分别返回每组的总和及平均值,语法如下:

SUM( [ DISTINCT | ALL ] 列名 | 表达式 )

AVG( [ DISTINCT | ALL ] 列名 | 表达式 )

说明:

1、SUM和AVG函数只能够对数值类型的列或表达式操作。

2、SUM和AVG函数会忽略掉NULL值后,再进行运算。

例:查询职位以SALES开头的所有员工 工资和、平均工资。

SELECT    SUM(sal), AVG(sal) 
FROM    emp 
WHERE    job LIKE 'SALES%';

4. COUNT函数

COUNT函数用来返回满足条件的每组记录个数,语法如下:

1、COUNT(*):返回满足条件的每组记录个数。

2、COUNT( [ DISTINCT | ALL ] 列名 | 表达式 ):返回满足条件的每组非空记录个数。

说明:

5个分组函数,除COUNT(*)不忽略掉空值外,其余函数都是忽略掉空值再进行运算。

例:查询部门30有多少个员工,可以有如下两种写法:

方法1:

SELECT    COUNT(*) 
FROM    emp 
WHERE    deptno = 30;

方法2:

SELECT    COUNT(empno)       --不建议写COUNT(*)
FROM    emp 
WHERE    deptno = 30;				

例:查询部门30有多少个员工有津贴

SELECT    COUNT(comm) 
FROM    emp 
WHERE    deptno = 30;

通过这个例子可以看出,COUNT(comm) 是忽略掉空值的。

5. 分组函数中的DISTINCT

DISTINCT会消除重复记录后再使用分组函数

例:查询有员工的部门数量。

SELECT  COUNT(DISTINCT deptno) 
FROM    emp;

6. 分组函数中空值处理

刚才已经说过,除了COUNT(*)之外,其它所有分组函数都会忽略列中的空值,然后再进行运算。如果想让空值参与运算,那应该如何处理呢。在MySQL中提供了IFNULL函数,用法如下:

IFNULL(表达式1,表达式2):表示如果表达式1的值是NULL则取表达式2的值,如果表达式1不为NULL则用表达式1本身值。

例:查询所有员工的平均津贴,没有津贴的按0处理。

SELECT AVG(comm) , COUNT(comm) 
FROM   emp;

以上方式,并没有把没有津贴的员工按0处理,参与求平均值的是4个员工。

SELECT AVG(IFNULL(comm,0)) , COUNT(IFNULL(comm,0))  
FROM   emp;

以上方式,通过使用IFNULL函数,把津贴是NULL的员工,按照0来处理,参与求平均值的是14个员工。

2、分组查询

1. 分组查询语法

上面的案例都是把一个表中的所有行做为一组来处理。如果想查询每个部门有多少人,每种岗位有多少人等等类似需求,就需要先把结果集按照某个列进行分组,然后再进行查询。

在SQL中,可以通过GROUP BY 子句,将表中满足WHERE条件的记录按照指定的列划分成若干个小组,划分的规则是:把满足条件的记录,在该列上相同的值做为一组。

语法如下:

SELECT 列名, 分组函数(列名)

FROM 表名

WHERE 条件表达式

GROUP BY 列名

ORDER BY 列名;

说明:

1、GROUP BY子句写在WHERE子句之后,其后的列名表示按照哪列进行分组

2、WHERE子句、ORDER BY 子句都可以省略不写

例:查询每个部门的编号,以及该部门所有员工的平均工资

SELECT   deptno, AVG(sal) 
FROM     emp 
GROUP BY deptno;

例:查询每种岗位上有多少个员工

SELECT  job , COUNT(empno) 
FROM emp 
GROUP BY job;

2. 分组语句的错误写法

分析如下SQL的执行结果

SELECT  job , COUNT(empno) , sal 
FROM emp 
GROUP BY job;

本SQL的查询结果集前两列显示的每个职位下的员工个数,第三个列显示的哪个员工的工资呢?在MySLQ中默认显示的该组中第一个员工的工资,放在这里没有任何实际意义。在Oracle数据库中,这种写法会提示语法错误。因此,当有GROUP BY子句时,SELECT子句后面只能写:被分组的列、分组函数,这两类元素才有实际意义。

3. 按多列分组查询

分组查询不但可以按照某一列进行分组,也可以按照多列进行分组。

例:查询每个部门每个岗位的工资总和。

SELECT   deptno, job, sum(sal) 
FROM     emp 
GROUP BY deptno, job; 

4. 多表查询分组查询

分组语句也可以和多表查询同时使用。

例:查询每个部门的部门编号,部门名称,部门人数,最高工资。

SELECT   dept.deptno, dname, count(empno), max(sal)  
FROM     emp ,dept 
WHERE emp.deptno = dept.deptno 
GROUP BY dept.deptno,dname; 

注意:此处emp表和dept表都有deptno列,需要在列名前加上表名。

3、过滤分组结果

1. HAVING子句

思考如下问题:查询部门人数大于3人的部门编号、部门人数。

"部门人数大于3"是一个条件,尝试一下是否可以写在WHERE子句中。

SELECT deptno,count(empno) 
FROM emp 
WHERE count(empno) >3 
GROUP BY deptno; 

该SQL执行结束后,出现错误提示"Invalid use of group function",表示组函数应用无效。原因在于WHERE子句在GROUP BY 子句之前执行,所以当WHERE子句执行的时候,尚未进行分组,也就无法在WHERE子句中使用分组函数。

在SQL中提供了HAVING子句,用来解决此问题,解决方式如下:

SELECT deptno,count(empno) 
FROM emp 
GROUP BY deptno 
HAVING count(empno) >3;

例:查询每个部门最高工资大于2900的部门编号,最高工资

SELECT   deptno, max(sal) 
FROM     emp 
GROUP BY deptno 
HAVING   max(sal)>2900; 

例:查询职位以SALES开头,每种职位的工资和,并且要求工资和大于5000,按照工资和升序排列

SELECT    job, SUM(sal)  
FROM      emp 
WHERE      job NOT LIKE 'SALES%' 
GROUP BY  job 
HAVING    SUM(sal)>5000 
ORDER BY  SUM(sal); 

总结:

1、WHERE子句用来过滤分组之前的记录,不能使用组函数

2、HAVING子句用来过滤分组之后的记录,可以使用组函数

4、SELECT语句6个子句的执行顺序

到现在为止,SELECT语句的6个子句都已经学习完毕,分别是:

SELECT子句、FROM子句、WHERE子句、GROUP BY子句、 HAVING子句、ORDER BY子句,书写直接按照此顺序就可以。那么这一条完整的SELECT子句发送到数据库服务器,执行顺序是如何的,可以通过案例来了解一下。

如下SQL语句:

SELECT    deptno,job,avg(sal) 
FROM      emp 
WHERE      job in ('SALESMAN','MANAGER','CLERK') 
GROUP BY  deptno,job 
HAVING avg(sal)>1000 
ORDER BY  3 DESC; 

执行过程:

1、通过FROM子句中找到需要查询的表;

2、通过WHERE子句进行非分组函数筛选判断;

3、通过GROUP BY子句完成分组操作;

4、通过HAVING子句完成组函数筛选判断;

5、通过SELECT子句选择显示的列或表达式及组函数;

6、通过ORDER BY子句进行排序操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/874245.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

并发编程:AQS(上)

一、AQS 是什么? AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 AQS 就是一个抽象类,主要用来构建锁和同步器。 public abstract class AbstractQueuedSynch…

“健康中国 医路无忧——公益联盟”积极响应,国内首支公益陪诊师志愿队伍正式成立

在快节奏的现代生活中,就医不再是简单的“看病”那么简单。面对复杂的医疗流程、专业的医学术语、以及在陌生环境中的焦虑,患者及家属往往感到无所适从。此时,陪诊服务如同一束光,照亮了就医之路,它的重要性不仅体现在…

Visual Studio汇编代码高亮与自动补全

高亮插件:AsmDude (可以按照我的颜色进行设置,或者你自己改) 代码自动补全:CodeGeex (功能很多,支持的语言很多),按Tab补全

骨传导耳机哪个品牌好用?精选五大高能骨传导耳机分享!

随着科技的进步和人们对健康生活的追求,骨传导耳机凭借其独特的设计理念和使用体验,迅速在运动爱好者和日常通勤族中流行起来。与传统耳机相比,骨传导耳机不仅能够提供清晰的音质,还能确保佩戴者在享受音乐的同时保持对外界环境的…

关于腾讯IM消息ID不统一的问题?服务端的MsgKey和前端的msgID不一样

角色>前端:web、小程序、客户端(ios、安卓);服务端;腾讯IM; 1、背景 IM消息ID不一致,本地没有缓存历史数据,导致在调用腾讯sdk方法时,id不一致报错问题 2、调研目的…

HTML 揭秘:HTML 编码快速入门

HTML 揭秘:HTML 编码快速入门 一 . 前端知识介绍二 . HTML 介绍三 . HTML 快速入门四 . HTML 编辑器 - VSCode4.1 插件安装4.2 修改主题配色4.3 修改快捷键4.4 设置自动保存4.5 创建 HTML 文件4.5 书写 HTML 代码4.6 常见快捷键 五 . 基础标签5.1 字体标签5.1.1 col…

java实现图片爬取

开发环境 IntelliJ IDEA 2021.1.3 jdk1.8 Jsoup介绍 一款Java 的HTML解析器 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数…

SPI子系统

IO特性 SPI接口一般使用四条信号线通信: SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选) MISO: 主设备输入/从设备输出…

服装|基于Java+vue的服装定制系统(源码+数据库+文档)

服装定制系统 目录 基于Javavue的服装定制系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布…

【PPT】文字突然变成方框

文章目录 前言一、问题描述二、解决方案参考文献 前言 在 ppt 画图时遇到的问题 一、问题描述 在 ppt 使用过程中,同一字体,有些变成了方框,有些没有变(排除字体缺失问题) 二、解决方案 如果是页数多了&#xff0…

MyEclipse2020安装教程(图文)

本章教程主要记录如何在Windows上安装MyEclipse2020.。 一、下载安装包 通过网盘分享的文件:Myeclipse 2020.rar 链接: https://pan.baidu.com/s/1fD2P0S0GU_zJlUHTPeXP-A?pwdv71m 提取码: v71m 二、安装步骤 1、打开解压后的文件夹,鼠标右击【myeclip…

Linux日志-日志小结

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具,它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

基于C#的UDP协议消息传输

1. 服务端 internal class Program{static void Main(string[] args){//1.创建SocketSocket socketServer new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//2.绑定IP、端口号EndPoint endPoint new IPEndPoint(IPAddress.Parse("127.0.0.1&…

【Qt】实现一个小闹钟

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton>//按钮类 #include <QLineEdit>//行编辑器 #include <QLabel>//标签类 #include <QTextEdit>//输入框 #include <QTimerEvent>//定时器事件类 #inc…

StorageSync数据缓存API

uni.setStorageSyncs参数:将 data 存储在本地缓存中指定的 key 中&#xff0c;会覆盖掉原来该 key 对应的内容&#xff0c;这是一个同步接口。 uni.setStorageSync函数里面写两个参数,分别是key和值,两个参数名称可以随便取,如果有同名的key,那么后面key的值会覆盖掉前面key的值…

详解BMP图片格式以及关于Verilog图像处理的仿真环境搭建

文章目录 一、BMP位图简介二、BMP格式分析2.1 如何用十六进制打开BMP图片2.2 头文件格式2.3 信息头格式2.4 调色板格式2.5 位图数据格式2.6 位图对齐方式三、Verilog图像处理的仿真环境搭建3.1 Verilog文件操作指令3.1.1 条件编译 (`` `ifdef``、 `` `else``、`` `endif``)3.1.…

在ATECLOUD中如何修改原有电源自动测试系统中的测试方案?

对于大多数电源自动测试系统而言&#xff0c;已经完成定型的电源模块测试方案想要重新修改难度非常的大&#xff0c;除非电源生产企业将整个系统返厂回电源自动测试系统的生产商&#xff0c;否则很难自己调整修改内部的项目和方案&#xff0c;而电源自动测试系统的生产商对原有…

spring自动装配

spring自动装配 Spring 框架提供了一种机制&#xff0c;称为自动装配&#xff08;Autowired&#xff09;&#xff0c;它允许 Spring 容器自动将依赖注入到 Bean 中&#xff0c;而无需显式地使用 XML 配置文件或构造函数注入。自动装配简化了依赖注入的过程&#xff0c;使得代码…

element-ui打包之后图标不显示,woff、ttf加载404

1、bug 起因 昨天在 vue 项目中编写 element-ui 的树形结构的表格&#xff0c;发现项目中无法生效&#xff0c;定位问题之后发现项目使用的 element-ui 的版本是 2.4.11 。看了官方最新版本是 2.15.14&#xff0c;然后得知 2.4.11 版本是不支持表格树形结构的。于是决定升级 el…

云曦2024秋季开学考

ezezssrf 第一关&#xff1a;md5弱比较 yunxi%5B%5D1&wlgf%5B%5D2 第二关&#xff1a; md5强比较 需要在bp中传参&#xff0c;在hackbar里不行 yunxiiM%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_B…