当前位置: 首页 > news >正文

[MySQL]聚合函数与分组

在这里插入图片描述


文章目录

  • 1. 聚合函数介绍
    • 1.1 什么是聚合函数
    • 1.2 常用的聚合函数
  • 2. 常用的聚合函数
    • 2.1 AVG()
    • 2.2 SUM()
    • 2.3 MAX()
    • 2.4 MIN()
    • 2.5 COUNT()
    • 2.6 补充
  • 3. GROUP BY
    • 3.1 分组的基本使用
    • 3.2 使用多个列分组
    • 3.3 结论
    • 3.4 WITH ROLLUP
  • 4. HAVING


1. 聚合函数介绍

1.1 什么是聚合函数

聚合(或聚集、分组)函数,是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。

聚合函数作用于一组数据,并对一组数据返回一个值。

在这里插入图片描述

1.2 常用的聚合函数

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

2. 常用的聚合函数

2.1 AVG()

只适用于数值类型的字段(或变量)

# 查询所有员工的平均工资
SELECT AVG(salary)
FROM employees;

在这里插入图片描述

2.2 SUM()

只适用于数值类型的字段(或变量)

# 查询所有员工的工资总和
SELECT
       SUM(salary),
       # 一共有107个员工
       AVG(salary) * 107
FROM employees;

在这里插入图片描述

2.3 MAX()

# 查询员工的最高工资
SELECT MAX(salary)
FROM employees;

在这里插入图片描述

MAX()适用于数值类型、字符串类型、日期时间类型等可以进行大小比较的字段(变量)。

SELECT MAX(last_name),
       MAX(hire_date)
FROM employees;

在这里插入图片描述

2.4 MIN()

# 查询员工的最低工资
SELECT MIN(salary)
FROM employees;

在这里插入图片描述

MIN()适用于数值类型、字符串类型、日期时间类型等可以进行大小比较的字段(变量)。

SELECT MIN(last_name),
       MIN(hire_date)
FROM employees;

在这里插入图片描述

2.5 COUNT()

计算指定字段在查询结果中出现的个数。

# 查询在全部的107行数据中,有几行拥有员工id这个字段
SELECT COUNT(employee_id)
FROM employees;

在这里插入图片描述

COUNT()统计个数,不关注字段的具体取值为多少,只关注某行数据是否具有该字段,该字段是否为空。不为空就加入计数。

SELECT COUNT(employee_id),
       count(salary),
       count(salary * 2)
FROM employees;

在这里插入图片描述

COUNT()统计常量

SELECT COUNT(employee_id),
       count(salary),
       count(salary * 2),
       count(1)
FROM employees;

在这里插入图片描述

计算表中有多少条记录:

SELECT COUNT(1),
       COUNT(*)
FROM employees;

在这里插入图片描述

不建议通过统计某个字段的取值的个数来统计表格的行数,因为有些字段的某些行可能取值为空,而COUNT()不会统计空值

2.6 补充

AVG()、SUM()和COUNT()一样,会过滤空值。

SELECT AVG(commission_pct),
       SUM(commission_pct) / COUNT(commission_pct),
       # 由于AVG() SUM() COUNT() 都会过滤空值
       # 所以SUM(commission_pct) / 107会比上面的小
       SUM(commission_pct) / 107
FROM employees;

在这里插入图片描述

# 计算公司的平均奖金率
# 错误计算方法
# 因为有没有奖金的员工,而AVG()会默认过滤空值
# 所以不能使用这种计算方法
SELECT AVG(commission_pct)
FROM employees;
# 正确的计算方法
# 对于没有奖金的员工commission_pct=0,然后进行统计
SELECT AVG(IFNULL(commission_pct, 0)),
       SUM(commission_pct) / COUNT(*),
       SUM(IFNULL(commission_pct, 0)) / COUNT(*)
FROM employees;

在这里插入图片描述
在这里插入图片描述

如何需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段) 哪个效率更高呢?
如果使用的是MyISAM 存储引擎,则三者效率相同,都是O(1)
如果使用的是InnoDB 存储引擎,则三者效率:COUNT(*) = COUNT(1)> COUNT(字段)

3. GROUP BY

GROUP BY子句可以将表中的数据分成若干组

3.1 分组的基本使用

在这里插入图片描述

# 查询各个部门的员工的平均工资
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

在这里插入图片描述

# 查询每个工作的平均工资
SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id;

在这里插入图片描述

3.2 使用多个列分组

在这里插入图片描述

# 查询各个(department_id, job_id)的平均工资
SELECT department_id, job_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id;

在这里插入图片描述

分组的字段可以调换顺序,结果一致。

最后结果都为(department_id, job_id)一样的为同一组,只是分组的顺序不一样,一个先根据部门分组再根据工作分组,一个根据工作分组再根据部门分组,最终显示的结果一样。

# 查询各个(job_id, department_id)的平均工资
SELECT job_id, department_id, AVG(salary)
FROM employees
GROUP BY job_id, department_id;

在这里插入图片描述

3.3 结论

  1. 结论1:
    SELECT中出现的非组函数的字段必须声明在GROUP BY 中。反之,GROUP BY中声明的字段可以不出现在SELECT中。
  2. 结论2:
    GROUP BY 声明在FROM后面、WHERE后面,ORDER BY 前面、LIMIT前面

3.4 WITH ROLLUP

MySQL中GROUP BY中使用WITH ROLLUP,在所有查询出的分组记录之后增加一条记录,该记录是对所有组在进行一次统计,比如计算每组的平均工资,WITH ROLLUP新加的记录会计算每组合起来总的平均工资,即公司的平均工资。

SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id WITH ROLLUP;

在这里插入图片描述

注意:
当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。

MySQL8.0,不报错,WITH ROLLUP新加记录也会参与排序

SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id WITH ROLLUP
ORDER BY avg_sal ASC;

在这里插入图片描述

4. HAVING

相关文章:

  • Linux Shell - echo 命令输出格式
  • Nginx反向代理和负载均衡实战
  • huawei euleros - 本地安装和远程安装的区别
  • 自然语言处理学习笔记——文本预处理
  • Hadoop 3.x(HDFS)----【HDFS 的 API 操作】
  • [MySQL]流程控制函数加密与解密函数MySQL信息函数其他函数
  • 数据仓库-数据分层理论详解
  • 【JDBC实战】水果库存系统 [代码优化]
  • python+selenium 爬虫
  • JDBC.
  • 推荐系统实战
  • 【opencv-c++】cv::mixChannels通道混合
  • 机器学习笔记(四)
  • 1480_人月神话阅读笔记_开篇
  • 《测绘综合能力》——测绘航空摄影
  • AB变换
  • 【Shell编程】Shell中Bash变量-位置参数变量
  • 安卓环境配置
  • Python脚本,物联网云服务器端口监控
  • 大数据讲课笔记4.2 HDFS架构和原理