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子句进行排序操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的强引用、软引用、弱引用和虚引用于JVM的垃圾回收机制

参考资料 https://juejin.cn/post/7123853933801373733 在 Java 中,引用类型分为四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用&#xf…

水晶连连看 - 无限版软件操作说明书

水晶连连看 – 无限版游戏软件使用说明书 文章目录 水晶连连看 – 无限版游戏软件使用说明书1 引言1.1 编写目的1.2 项目名称1.3 项目背景1.4 项目开发环境 2 概述2.1 目标2.2 功能2.3 性能 3 运行环境3.1 硬件3.2 软件 4 使用说明4.1 游戏开始界面4.2 游戏设定4.2.1 游戏帮助4…

9.6学习记录+三场笔试

一、去哪儿笔试挚文集团 1.在调度算法中平均等待时间最短的是什么? 短作业优先 2.给定一个字符串s,最有效的找到其中第一个不重复的字符的方法是? 一、使用哈希表 创建一个哈希表,用于存储字符及其出现的次数。可以使用编程语言中提供的字典&#x…

AI学习指南深度学习篇-随机梯度下降法(Stochastic Gradient Descent,SGD)简介

AI学习指南深度学习篇-随机梯度下降法(Stochastic Gradient Descent,SGD)简介 在深度学习领域,优化算法是至关重要的一部分。其中,随机梯度下降法(Stochastic Gradient Descent,SGD&#xff09…

Android 15 正式发布到 AOSP ,来了解下新特性和适配需求

其实在年初的时候就整理过《2024 ,Android 15 预览版来了》 和《提前窥探 Android 15 的新功能与适配》的相关内容,而随着时间进度推进,近日谷歌也正式发布了 Android 15 的正式版,虽然没什么「大亮点」,但是作为开发者…

11.2.软件系统分析与设计-数据库分析与设计

数据库分析与设计 数据库分析与设计的步骤 ER图和关系模型

目标检测-YOLOv1

YOLOv1介绍 YOLOv1(You Only Look Once version 1)是一种用于目标检测的深度学习算法,由Joseph Redmon等人于2016年提出。它基于单个卷积神经网络,将目标检测任务转化为一个回归问题,通过在图像上划分网格并预测每个网…

基于发布-订阅模型的音视频流分发框架

有时需要同时网络推流和把流封装为某格式,或做一些其它操作。这就需要一个分发流的机制,把同一路流分发给多个使用者去操作,下面实现了一个简易的线程安全的音视频流分发框架。代码如下: avStreamHub.h #ifndef STREAMHUB_H #def…

python连接MySQL获取表中数据

import pymysql# 连接数据库 conn pymysql.connect(hostlocalhost,userroot,passwordroot,dbtest,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor )def data_upload(key, value):# print(f"Key:{key},Value:{value}")print(f"{key},{value}")try:…

Ubuntu2204配置连续失败后账户锁定

配置启用pam_faillock sudo nano /etc/pam.d/common-auth在最上面添加以下内容 auth required pam_faillock.so preauth silent audit auth sufficient pam_unix.so nullok try_first_pass auth [defaultdie] pam_faillock.so authfail auditsudo nano /etc/pam.d/…

SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座

数字化办公时代,企业升级 IT 基础设施,已不再是选择题,而是必答题。 数字化办公时代,企业为何要升级 IT 基础设施? 随着时代变化与科技进步,人们的工作方式也发生了巨大变化。如今,远程办公、全…

VMware命令

打开终端:Ctrl Alt T 注意:时刻谨记空格号 自己常用命令: cd 拖入需要切换的文件夹:切换至指定文件夹; cd /:切换至根目录; unzip archive_name.zip:解压zip文件; na…

【论文精读】SCINet-基于降采样和交互学习的时序卷积模型

《SCINet: Time Series Modeling and Forecasting with Sample Convolution and Interaction》的作者团队来自香港中文大学,发表在NeurIPS 2022会议上。 动机 该论文的出发点是观察到时间序列数据具有独特的属性:即使在将时间序列下采样成两个子序列后,时间关系(例如数据…

科研小白成长记40——第三个五年计划

小gap期间,拼命玩和拼命休息的同时,仔细思考了下我期望的五年之后的样子,gap结束,算是目标愈发清晰起来。曾经,读博的目标是成为一名independent researcher,并且具备发至少一篇顶会的能力。而现在&#xf…

iOS面试:如何手动触发一个value的KVO?

在 iOS 开发中,手动触发一个属性的 KVO(Key-Value Observing)更新,通常是在属性的值在代码中发生变化时,确保观察者能够收到这些变化的通知。虽然 KVO 通常是在观察某些属性变化时自动通知观察者的,但如果你…

【PPT学习笔记】使用PPT制作动画/手书/视频等作品的适配性和可能性?

【PPT学习笔记】使用PPT制作动画/手书等作品的可能性? 背景前摇:(省流可不看) 最近找到另外一份新的实习工作,有很多需要用到PPT动画的地方。 然而,我们之前制作的理工科PPT全是摒弃了形式主义的艰苦朴素…

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒…

各种各样的正则表达式

一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$ 正…

uniapp整合windicss

官方文档:https://weapp-tw.icebreaker.top/docs/quick-start/frameworks/hbuilderx 安装: npm i -D tailwindcss postcss autoprefixer # 初始化 tailwind.config.js 文件 npx tailwindcss initnpm i -D weapp-tailwindcss# 假如 tailwindcss 在 weap…

Unity-OpenCV-Imgproc函数概览

OpenCV-Imgproc函数概览 函数名功能描述createLineSegmentDetector创建一个智能指针到 LineSegmentDetector 对象并初始化它。此算法用于检测图像中的线段。getGaussianKernel返回高斯滤波器的系数。这些系数用于平滑图像或进行高斯模糊。getDerivKernels返回计算图像空间导数的…