【MySQL】聚合函数和分组聚合

👦个人主页:@Weraphael

✍🏻作者简介:目前学习计网、mysql和算法

✈️专栏:MySQL学习

🐋 希望大家多多支持,咱一起进步!😁

如果文章对你有帮助的话

欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、聚合函数
      • [1.1 count函数](#1.1 count函数)
      • [1.2 sum函数](#1.2 sum函数)
      • [1.3 avg函数](#1.3 avg函数)
      • [1.4 max函数](#1.4 max函数)
      • [1.5 min函数](#1.5 min函数)
  • [二、分组聚合(group by + having)](#二、分组聚合(group by + having))
      • [2.1 group by](#2.1 group by)
      • [2.2 having](#2.2 having)
      • [2.3 having vs where](#2.3 having vs where)

一、聚合函数

MySQL中,聚合函数用于对数据进行汇总和统计,并返回单个值作为结果

1.1 count函数

  • 用于计算指定列中非null值的行数。它通常用于统计符合特定条件的行数。

【语法】

sql 复制代码
select  count(distinct 列名) [as] 重命名 from 表名;
# as也可以不加
# 可以去重distinct统计

注意:

  • 如果使用count(*),它会统计表中所有行的数量,包括null值。
  • 如果使用count(列名),它会统计指定列中非null值的行数。

【使用案例】

假设有一个名为employees的表,包含员工的信息,如下所示:

  • 统计表中的总行数
sql 复制代码
select count(*) from employees;
  • 计算特定条件下的行数,比如部门为 HR的员工人数:
sql 复制代码
select count(*) as HR的员工人数 from employees where department='HR';

1.2 sum函数

  • 用于计算指定列的数值总和。它通常用于计算某个列中的数值总和,比如计算某一列的总销售额、总成绩等。

【语法】

sql 复制代码
select sum(distinct 列名) [as 重命名] from 表名;
  • 注意:如果指定的列包含null值,则 sum 函数会忽略null值。

任何数对null进行+-*/都是null ,由此看出sum 函数确实忽略了null值。

【使用案例】

假设有一个名为sales的表,包含产品销售信息,表中数据如下:

  • 计算总销售额
sql 复制代码
select sum(amount)  from sales;
  • 计算特定条件下的销售总额,比如产品为A的销售总额
sql 复制代码
select sum(amount) A的总销售额 from sales where product='A';
  1. 计算出总销售额后再除以5
sql 复制代码
select sum(amount)/5 from sales;

1.3 avg函数

  • 用于计算指定列的平均值。它通常用于计算某一列的平均数,比如计算某产品的平均销售额、平均成绩等。

【语法】

sql 复制代码
select avg(distinct 列名) from 表名;

注意:如果指定的列包含null值,则avg函数会忽略null值。

【使用案例】

假设有一个名为grades的表,包含学生的考试成绩信息,表中数据如下:

  • 计算班级学生的平均值
sql 复制代码
# 写法一:
select avg(score) from grades;

# 写法二:
select sum(score)/count(score) from grades;

1.4 max函数

  • 用于获取指定列中的最大值。它通常用于找到某一列中的最大值,比如找到某产品的最高价格、最高温度等。

【语法】

sql 复制代码
select max(列名) from 表名;

注意:如果指定的列包含null值,则max函数会忽略null

【使用案例】

假设有一个名为products的表,包含产品的价格信息,表中数据如下:

  • 找到价格的最高值
sql 复制代码
select max(price) from products;
  • 找到特定条件下的最大值,比如产品名称为B的价格
sql 复制代码
select max(price) from products where product='B';

1.5 min函数

  • 用于获取指定列中的最小值。它通常用于找到某一列中的最小值,比如找到某产品的最低价格、最低温度等。

基本语法如下:

【语法】

sql 复制代码
select min(列名) from 表名;

注意:如果指定的列包含null值,则min函数会忽略null值。

【使用案例】

假设有一个名为Student的表,包含学生的语数英成绩,表中数据如下:

  • 返回数学成绩最低分
sql 复制代码
select min(math) from Student;
  • 返回>70分以上的数学最低分
sql 复制代码
select min(math) from Student where math>70;

二、分组聚合(group by + having)

2.1 group by

  • 聚合函数常与group by结合使用 ,以便对数据进行分组聚合。(对数据进行分组统计)
  • 分组顾名思义就是将一组拆成了多个组,然后进行各自组内的统计。也可以看成将一张表拆成多个子表进行聚合统计。
  • 执行顺序:先分组,再聚合

【语法】

sql 复制代码
select group_name, 聚合fuc, ... from 表名 group by group_name, ...;

注意: group_name:除聚合函数括号里的列名以外,只有在group by后面出现的列名称,才能在select后面出现。

【使用案例】

  • 准备工作:导入scott_data.sql文件(来自oracle 9i的经典测试表)。该scott由三个表组成,分别是:

  • emp员工表(子表)

  • dept部门表(从表)

  • sakgrade工资等级表(主表)

这里重点看emp员工表(子表)即可

  • 通过员工表,显示每个部门的平均工资和最高工资
sql 复制代码
select deptno, avg(sal),max(sal) from emp group by deptno;
  • 显示每个部门的每种岗位的平均工资和最低工资
sql 复制代码
select deptno, job, avg(sal),min(sal) from emp group by deptno, job;

2.2 having

having的功能其实和where一样,当你需要在 分组后的结果集上应用条件过滤 时,可以配合having子句使用。

  • 显示平均工资低于2000的部门和它的平均工资
sql 复制代码
select deptno,avg(sal) 平均工资 from emp group by deptno having 平均工资<2000;

注意:where子句后面不能用重命名,而having可以。

  • SMITH员工不参与统计,显示平均工资低于2000的部门和它的平均工资
sql 复制代码
select deptno,job,avg(sal) 平均工资 from emp where ename!='SMITH' group by deptno,job having 平均工资<2000;

2.3 having vs where

sql查询中,wherehaving都是用于筛选数据的关键字 ,但它们有着不同的作用范围使用位置

  • 作用范围

    • where用于在对原始数据进行查询之前筛选行,它作用于未分组的数据
    • having用于在对数据进行聚合后筛选结果,它作用于已分组的数据。
  • 使用位置

    • where子句通常出现在sql查询的起始部分,用于过滤原始数据表的行。
    • having子句通常出现在group by子句之后,用于筛选分组后的结果。
相关推荐
牧以南歌〆1 小时前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
花花鱼2 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
互联网搬砖老肖2 小时前
运维打铁: MongoDB 数据库集群搭建与管理
运维·数据库·mongodb
夜月yeyue2 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
典学长编程2 小时前
数据库Oracle从入门到精通!第四天(并发、锁、视图)
数据库·oracle
kfepiza3 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
alexhilton3 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
积跬步,慕至千里3 小时前
clickhouse数据库表和doris数据库表迁移starrocks数据库时建表注意事项总结
数据库·clickhouse
极限实验室3 小时前
搭建持久化的 INFINI Console 与 Easysearch 容器环境
数据库
星辰离彬4 小时前
Java 与 MySQL 性能优化:Java应用中MySQL慢SQL诊断与优化实战
java·后端·sql·mysql·性能优化