MySQL聚合函数

article/2025/10/11 0:59:10

一、聚合函数介绍

1、聚合函数作用于一组数据,并对一组数据返回一个值。
2、聚合函数类型

AVG()
SUM()
MAX()
MIN()
COUNT()

3、聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。

二、AVG和SUM函数

# AVG函数用于求一组数据的平均值,SUM函数用于求一组数据的和
# 适用于数值类型
SELECT AVG(salary),SUM(salary),AVG(salary )*107
FROM employees;

在这里插入图片描述
三、MAX和MIN函数

# MAX函数用来求一组数据的最大值,MIN函数用来求一组数据的最小值
# 适用于数值类型、字符串类型、日期时间类型的字段(或变量)(即适用于任意数据类型)
SELECT MAX(salary),MIN(salary)
FROM employees;SELECT MAX(last_name),MIN(last_name),MAX(hire_date),MIN(hire_date)
FROM employees;

在这里插入图片描述
四、 COUNT函数

# COUNT函数用于返回表中数据和
# 适用于任意数据类型#计算指定字段在查询结构中出现的个数(不包含NULL值的)
SELECT COUNT(employee_id),COUNT(salary),COUNT(2* salary),COUNT(1),COUNT(2),COUNT(*)# COUNT(1),COUNT(2)相当于COUNT(*)
FROM employees;SELECT *  FROM employees; # 一共107条记录#计算指定字段出现的个数时,是不计算NULL值的
SELECT COUNT(commission_pct)
FROM employees;SELECT commission_pct
FROM employees
WHERE commission_pct IS NOT NULL; # 一共35条记录# 公式:AVG = SUM / COUNT
SELECT AVG(salary),SUM(salary)/COUNT(salary),
AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),SUM(commission_pct)/107 # 前两个相同,与最后一个不同是因为count值只有35,而最后一个是107
FROM employees;# 查询公司的平均奖金率
SELECT SUM(commission_pct)/COUNT(IFNULL(commission_pct,0)),
AVG(IFNULL(commission_pct,0))
FROM employees;

在这里插入图片描述
总结:
如何需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段) 哪个效率更高呢?

(1)如果使用的是MyISAM 存储引擎,则三者效率相同,都是O(1) ;
(2)如果使用的是InnoDB 存储引擎,则三者效率:COUNT(*) =COUNT(1)> COUNT(字段)

五、GROUP BY

# 使用GROUP BY的关键字眼是"各个"# 查询各个部门的平均工资,最高工资
SELECT department_id,AVG(salary),SUM(salary)
FROM employees
GROUP BY department_id;# 查询各个job_id的平均工资
SELECT job_id,AVG(salary)
FROM employees
GROUP BY job_id;# 查询各个department_id,job_id的平均工资
# 法一
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id,job_id;# 法二
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY job_id,department_id;# 与法一互换位置#使用 WITH ROLLUP 关键字之后,在所有查询出的分组记录之后增加一条记录,
#该记录计算查询出的所有记录的总和,即统计记录数量
#注意:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP;# 查询各个部门的平均工资,按照平均工资升序排列
SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id
ORDER BY avg_sal ASC;

在这里插入图片描述
六、HAVING

# HAVING主要用来过滤数据的
# 若过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
# 若过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。
# HAVING 必须声明在 GROUP BY 的后面# 查询各个部门中最高工资比10000高的部门信息
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000;# 错误写法( Invalid use of group function)
SELECT department_id,MAX(salary)
FROM employees
WHERE MAX(salary) > 10000 # WHERE中不能使用聚合函数
GROUP BY department_id;# 查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)>10000;

在这里插入图片描述
总结:
(1)WHERE和HAVING的对比

区别1:WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。
这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。这是因为,在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。另外,WHERE排除的记录不再包括在分组中。

区别2:如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选
这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING 则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低

在这里插入图片描述
(2)开发中的选择

WHERE 和 HAVING 也不是互相排斥的,我们可以在一个查询里面同时使用 WHERE 和 HAVING。包含分组统计函数的条件用HAVING,普通条件用 WHERE。这样,我们就既利用了 WHERE 条件的高效快速,又发挥了 HAVING 可以使用包含分组统计函数的查询条件的优点。当数据量特别大的时候,运行效率会有很大的差别。

七、SELECT的执行过程

1、查询的结构

#方式1: 
SELECT ...,....,... 
FROM ...,...,.... WHERE 多表的连接条件 
AND 不包含组函数的过滤条件 
GROUP BY ...,... 
HAVING 包含组函数的过滤条件 
ORDER BY ... ASC/DESC 
LIMIT ...,... #方式2: 
SELECT ...,....,... 
FROM ... JOIN ... 
ON 多表的连接条件 
JOIN ... 
ON ... 
WHERE 不包含组函数的过滤条件 
AND/OR 不包含组函数的过滤条件 
GROUP BY ...,... 
HAVING 包含组函数的过滤条件 
ORDER BY ... ASC/DESC 
LIMIT ...,... #其中: 
#(1)from:从哪些表中筛选 
#(2)on:关联多表查询时,去除笛卡尔积 
#(3)where:从表中筛选的条件 
#(4)group by:分组依据 
#(5)having:在统计结果中再次筛选 
#(6)order by:排序 
#(7)limit:分页

2、SELECT执行顺序
(1)关键字的顺序是不能颠倒的:
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...

(2)SELECT 语句的执行顺序(在 MySQL 和 Oracle 中,SELECT 执行顺序基本相同)
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT

(3)在 SELECT 语句执行这些步骤的时候,每个步骤都会产生一个 虚拟表 ,然后将这个虚拟表传入下一个步骤中作为输入。需要注意的是,这些步骤隐含在 SQL 的执行过程中,对于我们来说是不可见的。

3、SQL的执行原理

SELECT 是先执行 FROM 这一步的。在这个阶段,如果是多张表联查,还会经历下面的几个步骤:

1.首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
3.添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟 表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。

当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据。

当我们拿到了查询数据表的原始数据,也就是最终的虚拟表 vt1 ,就可以在此基础上再进行 WHERE 阶 段 。在这个阶段中,会根据 vt1 表的结果进行筛选过滤,得到虚拟表 vt2。

然后进入第三步和第四步,也就是 GROUP 和 HAVING 阶段 。在这个阶段中,实际上是在虚拟表 vt2 的基础上进行分组和分组过滤,得到中间的虚拟表 vt3 和 vt4 。

当我们完成了条件筛选部分之后,就可以筛选表中提取的字段,也就是进入到 SELECT 和 DISTINCT 阶段 。

首先在 SELECT 阶段会提取想要的字段,然后在 DISTINCT 阶段过滤掉重复的行,分别得到中间的虚拟表vt5-1 和 vt5-2 。

当我们提取了想要的字段数据之后,就可以按照指定的字段进行排序,也就是 ORDER BY 阶段 ,得到虚拟表 vt6。

最后在 vt6 的基础上,取出指定行的记录,也就是 LIMIT 阶段 ,得到最终的结果,对应的是虚拟表vt7 。

当然我们在写 SELECT 语句的时候,不一定存在所有的关键字,相应的阶段就会省略。

同时因为 SQL 是一门类似英语的结构化查询语言,所以我们在写 SELECT 语句的时候,还要注意相应的关键字顺序,所谓底层运行的原理,就是我们刚才讲到的执行顺序。

八、小练习

#1.查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary) max_sal ,MIN(salary) mim_sal,AVG(salary) avg_sal,SUM(salary) sum_sal
FROM employees;#2.查询各job_id的员工工资的最大值,最小值,平均值,总和
SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id;#3.选择具有各个job_id的员工人数
SELECT job_id,COUNT(*)
FROM employees
GROUP BY job_id;#4.查询员工最高工资和最低工资的差距(DIFFERENCE)  #DATEDIFF
SELECT MAX(salary) - MIN(salary) "DIFFERENCE"
FROM employees;#5.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT manager_id,MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary) >= 6000;#6.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序 
SELECT d.department_name,d.location_id,COUNT(employee_id),AVG(salary)
FROM departments d LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY department_name,location_id;# 7.查询每个工种、每个部门的部门名、工种名和最低工资 
SELECT d.department_name,e.job_id,MIN(salary)
FROM departments d LEFT JOIN employees e
ON d.`department_id` = e.`department_id`
GROUP BY department_name,job_id;

所用数据库请看文章末尾:SQL语言和基本的select语句


http://chatgpt.dhexx.cn/article/3n3nXN9G.shtml

相关文章

MySql常用函数大全讲解

MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。例如,字符串连接函数可以很方便的将多个字符串连接在一起。在这一讲中…

MySql统计函数COUNT详解

MySql统计函数COUNT详解 1. COUNT()函数概述2. COUNT()参数说明3. COUNT()判断存在4. COUNT()阿里开发规范 1. COUNT()函数概述 COUNT() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为NULL数据&#xff0…

MYSQL窗口函数

文章目录 一、为何使用窗口函数二、什么是窗口函数三、窗口函数如何使用3.1 序号函数3.2 分布函数3.3 前后函数3.4 头尾函数3.5 其他函数3.6 聚类窗口函数 一、为何使用窗口函数 在日常工作中经常会遇到类似这样的需求: 怎么样得到各部门工资排名前N名的员工列表?…

MySQL常见函数

一、单行函数 1.1 字符函数 length(str):统计字符串的字节数(取决于编码方式,utf8汉字3字节,gbk汉字2字节)concat(str1, str2):拼接字符substr/substring(str, n1 [,n2]):切割字符&#xff0c…

MySQL常用函数大全(总结篇)

本篇文章讲解是是MySQL的函数方法,涵盖所有的MySQL常见的方法。下面是本篇文章的目录结构,可以根据自己需求点击右方目录查找: 一、数字函数二、字符串函数三、日期函数四、MySQL高级函数 (一)数字函数 1、ABS(x) 返…

MySQL常用函数大全(实例演示)

此博客主要包括如下类型函数: 一、数字函数 二、字符串函数 三、日期函数 四、MySQL高级函数 一、数字函数 1、ABS(x) 返回x的绝对值 SELECT ABS(-1); 结果: 2、AVG(expression) 返回一个表达式的平均值,expression 是一个字段 SELE…

MySql常用函数大全

MySql常用函数大全 MySQL数据库中提供了很丰富的函数。MySQL函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。例如,字符串连接函数可以很方便的将多个字符串连接…

MySQL函数大全

目录 (一)字符函数 ①length(str)函数 ②concat(str1,str2,...)函数 ③upper(str)、lower(str)函数 ④substr(str,start,len)函数 ⑤instr(str,要查找的子串)函数 ⑥trim(str)函数 ⑦lpad(str,len,填充字符)、rpad(str,len,填充字符)函数 ⑧rep…

MySQL函数(经典收藏)

MySQL函数(经典收藏) MySQL函数 MySQL数据库提供了很多函数包括: 数学函数;字符串函数;日期和时间函数;条件判断函数;系统信息函数;加密函数;格式化函数; …

MySql常用函数大全(详细)

一、数学函数 (1)ABS(x)返回绝对值;例: (2)PI()返回圆周率的函数,默认值为小数后六位;例: (3)求函…

齐全且实用的MySQL函数使用大全

目录 一、MySQL函数介绍 二、MySQL函数分类 (一)单行函数 ①字符串函数 ②数学函数 ③日期函数 ④流程控制函数 ⑤系统信息函数 ⑥其他函数 (二)聚合函数 三、函数使用示例 (一)字符函数 ①le…

sql注入的小工具介绍

sql注入的小工具介绍 啊D注入工具: pangolin(穿山甲) 穿山甲;Pangolin(中文译名为穿山甲)一款帮助渗透测试人员进行Sql注入测试的安全工具,是深圳宇造诺赛科技有限公司(Nosec)旗下的网站安全测…

sql注入检测工具 mysql_SQL注入测试

简介 SQL 注入是一种专门针对SQL语句的攻击方式。通过把SQL命令插入到web表单提交、输入域名或者页面请求的查询字符串中,利用现有的程序,来非法获取后台的数据库中的信息。在web的测试中涉及到的会比较多些。 注入原理 存在注入的原因是后台在编写程序时…

mysql注入扫描网站漏洞工具_网站安全检测,高手必备几款SQL注入工具

按照百度说法,SQL注入是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 利用SQL注入,攻击者可远程利用SQL注入漏洞,窃取用户数据库数据,包括用户名、密码、登…

3-5SQL注入漏洞工具的使用

如果我们要去找出,一个网站中可能存在的所有漏洞,那对于我们而言是相当累的,有时候,我们只能借助于sql注入漏洞的工具,进行检测,检测的工具对我们相当重要,因为他能替代人工和提高效率 我们本篇…

sql注入检测工具 mysql_Java自动化SQL注入测试工具—jSQL Injection v0.5

jSQL是一款轻量级安全测试工具,可以检测SQL注入漏洞。它跨平台(Windows, Linux, Mac OS X, Solaris)、开源且免费。 更新记录 0.5SQL shell Uploader 0.4 Admin page checker and preview Brute forcer (md5 mysql...) Coder (encode decode base64 hex md5...) 0.3…

sql注入工具、检测及手工注入集合

0x01 sqlmap sqlmap是一个开源渗透测试工具,它可以自动检测和利用SQL注入缺陷,并接管数据库服务器。它配备了强大的检测引擎,为最终渗透测试提供了许多细分功能,以及广泛的交换机,从数据库指纹、从数据库获取数据&…

sql 注入工具

众所周知,SQL注入攻击是最为常见的Web应用程序攻击技术。同时SQL注入攻击所带来的安全破坏也是不可弥补的。以下罗列的10款SQL工具可帮助管理员及时检测存在的漏洞。 BSQL Hacker BSQL Hacker是由Portcullis实验室开发的,BSQL Hacker 是一个SQL自动注入工…

sql注入 学习笔记

学习来源视频:https://www.bilibili.com/video/BV1HT411E7bH?p1&vd_source91ac068ef47e260a09856e8db81907c9 什么是sql注入 sql注入又称sql injection,通过网页或者网络指令的方式修改原本的sql指令,从而从数据库中查询的敏感的信息。…

Java 防止 SQL 注入工具类

2019独角兽企业重金招聘Python工程师标准>>> package cn.manmanda.api.util;import javax.servlet.http.HttpServletRequest;/*** 防止SQL注入工具类* author * date 2017/12/29 15:39*/ public class AntiSQLInjectionUtil {// public final static String regex …