一、五大常用聚合函数

  • SUM():求总和,只适用于数值类型字段,如果是字符串类型不会报错会返回0,会自动过滤空值
  • AVG():求平均值,只适用于数值类型字段,字符串类型不会报错会返回0,会自动过滤空值
  • MAX():求最大值,适用于数值类型、字符串类型和日期时间类型字段
  • MIN():求最小值,适用于数值类型、字符串类型和日期时间类型字段
  • COUNT():用于计算查询结果集中的数据共有多少条
    • COUNT(*)
    • COUNT(常数):例如COUNT(0),COUNT(1)
    • COUNT(指定字段):此方式只能用于那种不存在NULL的字段,如果存在空值,统计总数时不计入
    • 如果是MyISAM引擎,这三种方式的效率相同,因为此引擎内部有一个计数器在维护着行数。如果是InnoDB引擎,那么第一和第二种效率高于第三种,后面会细说

注意:MySQL中聚合函数是不能嵌套使用的

我们创建一个表t_decade_book来进行验证

DROP TABLE IF EXISTS `t_decade_book`;
CREATE TABLE `t_decade_book`  (`book_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '书id',`book_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '书名',`book_count` int(10) DEFAULT NULL COMMENT '数量',`detail` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述',PRIMARY KEY (`book_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;INSERT INTO `t_decade_book` VALUES (1, 'Java从入门到秃头', 20, 'Java学习');
INSERT INTO `t_decade_book` VALUES (2, '数据库从删库到跑路', 20, '数据库学习');
INSERT INTO `t_decade_book` VALUES (3, '测试从入职到干架', 20, '测试脚本学习');
INSERT INTO `t_decade_book` VALUES (4, '划水越划越爽', NULL, '划水技巧学习');

得到的表数据如下

SELECT AVG(book_count),SUM(book_count),AVG(book_count)*4 FROM t_decade_book;SELECT MAX(book_count),MIN(book_count),MAX(book_name),MIN(book_name) FROM t_decade_book;SELECT COUNT(book_id),COUNT(1),COUNT(*),COUNT(book_count) FROM t_decade_book;SELECT AVG(book_count),SUM(book_count),SUM(book_count)/4,SUM(book_count)/COUNT(book_count) FROM t_decade_book;

执行结果如下



二、GROUP BY

首先我们向之前创建的t_decade_blog表中插入一条数据

INSERT INTO t_decade_blog(id,name,author,create_time,views)VALUES('d3258b79-d543-49bb-9850-16cac7566666','JVM系列','十年',NOW(),8000);

表格中结果如下

然后我们测试一下GROUP BY操作

# 根据单列进行分组
SELECT author,AVG(views) FROM t_decade_blog GROUP BY author;# 根据多列进行分组,如果分组的条件相同,顺序不同不会影响最终结果
# 我们可以理解为根据这些条件进行组合,只有符合这些条件的才会分到一个组里
SELECT id,author,AVG(views) FROM t_decade_blog GROUP BY id,author;
SELECT author,id,AVG(views) FROM t_decade_blog GROUP BY author,id;# 当使用GROUP BY关键字时,SELECT中涉及到的非聚合函数包含的字段,必须出现在GROUP BY后面
# 但是GROUP BY关键字后面的字段不一定要出现在SELECT之后
# 另外,在不使用GROUP BY时,聚合函数不能和普通字段放在一起进行查询
SELECT author,id,AVG(views) FROM t_decade_blog GROUP BY author;# with rollup作用在聚合函数。如果聚合函数是COUNT(*)则会在统计的记录中再次求COUNT(*)
# 如果是AVG(),则会去除分组条件,求该字段的AVG()
# 使用WITH ROLLUP后不能再使用ORDER BY
SELECT author,AVG(views) FROM t_decade_blog GROUP BY author WITH ROLLUP;SELECT book_id,AVG(book_count) FROM t_decade_book GROUP BY book_id WITH ROLLUP;SELECT author,COUNT(views) FROM t_decade_blog GROUP BY author WITH ROLLUP;

执行结果如下







注意GROUP BY的使用顺序

  • 放在FROMWHERE后面
  • 放在ORDER BYLIMIT前面

三、HAVING

1、HAVING 子句可以让我们筛选分组后的各组数据

  • 当我们想使用聚合函数作为数据的过滤条件时,就不能搭配WHERE使用了,必须使用HAVING来进行替换。比如我们想筛选出哪些部门的最高工资大于10000,那么就要先根据部门id进行分组,然后再使用HAVINGMAX(salary)进行过滤
  • 如果过滤条件中没有聚合函数,那就强烈建议使用WHERE
  • HAVING必须声明在GROUP BY后面
  • 在日常开发中,使用HAVING的前提是我们使用了GROUP BY

2、HAVINGWHERE的对比

  • 从适用范围来说,HAVING更广
  • 如果过滤条件中没有聚合函数,那么WHERE的执行效率要高于HAVING。因为WHERE的执行顺序是排在HAVING前面的,它会筛选掉不满足条件的数据,这样后面GROUP BY分组以及HAVING要处理的数据量就更小了
# 错误演示
SELECT id,MAX(views)
FROM t_decade_blog
WHERE MAX(views) > 4000
GROUP BY id;SELECT id,MAX(views)
FROM t_decade_blog
GROUP BY id
HAVING MAX(views) > 4000;# 如果我们想查出特定博客id中最大浏览量大于4000的书籍
# 方式一:WHERE搭配HAVING,推荐此方式,执行效率更高
SELECT id,MAX(views)
FROM t_decade_blog
WHERE id IN ('76782763-48d0-4cef-b8e1-1054e181e41d',
'd3258b79-d543-49bb-9850-16cac7565f57',
'd3258b79-d543-49bb-9850-16cac7566666')
GROUP BY id
HAVING MAX(views) > 4000;# 方式二
SELECT id,MAX(views)
FROM t_decade_blog
GROUP BY id
HAVING MAX(views) > 4000
AND id IN ('76782763-48d0-4cef-b8e1-1054e181e41d',
'd3258b79-d543-49bb-9850-16cac7565f57',
'd3258b79-d543-49bb-9850-16cac7566666');

四、SQL底层执行原理

1、SELECT语句的完整结构

SQL92语法结构

SELECT 字段1,字段2,...(可能存在聚合函数)
FROM 表1,表2,...
WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
GROUP BY 分组字段1,分组字段2...
HAVING 包含聚合函数的过滤条件
ORDER BY 排序字段1,排序字段2...(ASC / DESC)
LIMIT 偏移量,条目数

SQL99语法结构

SELECT 字段1,字段2,...(可能存在聚合函数)
FROM 表1 (LEFT / RIGHT) JOIN 表2 ON 多表的连接条件
(LEFT / RIGHT) JOIN 表2 ON 多表的连接条件2...
WHERE 不包含聚合函数的过滤条件
GROUP BY 分组字段1,分组字段2...
HAVING 包含聚合函数的过滤条件
ORDER BY 排序字段1,排序字段2...(ASC / DESC)
LIMIT 偏移量,条目数

2、SQL语句的执行过程

我们就以SQL99语法结构为例进行分析

  • 首先执行FROMHAVING范围内的语句

    • 先根据FROM找出所需要的表,这里相当于之前说过的CROSS JOIN—>然后根据ON后面的连接条件去除无法被关联的数据—>判断是否是左/右外连接(LEFT / RIGHT JOIN)—>根据WHERE过滤数据—>根据GROUP BY分组(这一步之后,针对每组的聚合函数进行过滤才有了意义,这就能说得通为什么WHERE中不能使用聚合函数)—>根据HAVING进行分组
  • 然后执行SELECT:执行完第一步会查出所有字段,这一步筛选出我们需要哪些字段,如果有DISTINCT关键字,那么还会进行去重
  • 最后执行ORDER BYLIMIT:对上一步得到的结果集进行排序,然后再进行分页

如有错误,欢迎指正!!!

【MySQL】聚合函数相关推荐

  1. mysql聚合函数count用法_MySQL中聚合函数count的使用和性能优化技巧

    本文的环境是Windows 10,MySQL版本是5.7.12-log 一. 基本使用 count的基本作用是有两个: 统计某个列的数据的数量: 统计结果集的行数: 用来获取满足条件的数据的数量.但是 ...

  2. mysql 聚合函数内比较运算符_关于常用 MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结...

    /* 关于MYSQL 聚合函数,其他函数 ,类型转换,运算符 总结,*/ -- 1 运算符优先级  /* 12.1.1. 操作符优先级 以下列表显示了操作符优先级的由低到高的顺序.排列在同一行的操作符 ...

  3. MySQL——聚合函数和group by分组的使用

    文章目录 MySQL--聚合函数和group by分组的使用 1.聚合函数介绍 2.GROUP BY 分组 3.常见的聚合函数 4.SQL执行顺序 MySQL--聚合函数和group by分组的使用 ...

  4. ThinkPH5 SQL注入(Mysql 聚合函数)

    ThinkPH5 SQL注入(Mysql 聚合函数) 漏洞概要 初始配置 漏洞利用 漏洞分析 漏洞修复 攻击总结 漏洞概要 本次漏洞存在于所有 Mysql 聚合函数相关方法,由于程序没有对数据进行很好 ...

  5. Mysql 聚合函数嵌套使用

    Mysql 聚合函数嵌套使用 目的:Mysql 聚合函数嵌套使用 聚合函数不可以直接嵌套使用,比如: max(count(*)) 但是可以嵌套子查询使用(先分组取出count值, 再将count值倒序 ...

  6. mysql 聚合函数嵌套,Mysql 聚合函数嵌套使用操作

    聚合函数不可以直接嵌套使用,比如: max(count(*)) 但是可以嵌套子查询使用 eg: 注:后面那个 as 必须要写 select max(total) from ( select count ...

  7. mysql 聚合函数嵌套_Mysql聚合函数嵌套如何使用 Mysql聚合函数嵌套使用方法

    Mysql聚合函数嵌套如何使用?本篇文章小编给大家分享一下Mysql聚合函数嵌套使用方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 目的:Mysql 聚合函数嵌套使用 ...

  8. mysql聚合函数能不能嵌套_Mysql 聚合函数嵌套使用操作

    目的:mysql 聚合函数嵌套使用 聚合函数不可以直接嵌套使用,比如: max(count(*)) 但是可以嵌套子查询使用 eg: 注:后面那个 as 必须要写 select max(total) f ...

  9. mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法

    Mysql 与聚合函数在一起时候where条件和having条件的过滤时机 where 在聚合之前过滤 当一个查询包含了聚合函数及where条件,像这样的情况 select max(cid) from ...

  10. MySQL 聚合函数(一)聚合(组合)函数概述

    MySQL版本:5.7+ 本节介绍对值的集合进行操作的组合(聚合)函数.翻译自:Aggregate (GROUP BY) Function Descriptions 一.MySQL 5.7中的聚合函数 ...

最新文章

  1. equal与hashcode的区别
  2. Spring整合Hibernate和Struts2 (SSH)
  3. php环行队列实现,java数组实现队列及环形队列实现过程解析
  4. unity许可证不可用_不可思议之梦蝶从PC版移植到Nintendo Switch经验分享(上)
  5. 7-7 天梯赛的善良 (20 分)
  6. Python打包成.exe文件详细实例
  7. 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析(转)...
  8. Could not find class
  9. Khronos关于WebGL最新进展
  10. Spring MVC-学习笔记(1)认识spring mvc
  11. RTL8762DW手环烧录方法
  12. 软件测试之常见逻辑思维题
  13. Python 新手刚学链表,做了一个“捣浆糊”版的单链表类
  14. acm第一周学习总结
  15. python提交表单发邮件_通过Mailgun和Python发送带有表单数据的电子邮件
  16. 海豚调度器(dolphinscheduler)再次使用,添加钉钉预警
  17. 关于docker 意外停止,重新快速启动措施
  18. 魔兽世界联盟物价稳定的服务器,魔兽世界怀旧服NAXX物价惊到隔壁玩家:堕落的灰烬使者210W...
  19. 2006-2020年全国31省人口老龄化水平
  20. 计量经济学:多重共线性

热门文章

  1. 华为路由器登录方式设置
  2. [paper] InsightFace
  3. 愚弄了上万人,AI开始文化入侵了?道翰天琼认知智能机器人平台API接口大脑为您揭秘。
  4. lora物联网解决方案
  5. 微信小程序调用地图设置起点终点导航
  6. `docker数据持久化volume和bind mounts两种方式
  7. DB2的HADR的搭建
  8. arcgis图斑尖角检查_运用官方扩展模块高效检查图斑尖锐角(免费教程,不用插件)...
  9. 【计算机毕业设计】家政服务中介网
  10. Pushed master to new branch origin/master