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

MySQL基础——聚合查询(全面解析)

目录

聚合查询

1. 聚合函数

1.1.1 count函数

1.1.2 sum函数

1.1.3 avg函数

1.1.4 max函数

1.1.5 min函数

2. 分组函数的注意事项:

2.1 事项一

2.2 事项二

2.3 事项三

2.4 事项四

附本节测试SQL


聚合查询

1. 聚合函数

聚合查询又叫函数查询,它是通过⼀些特定的函数根据需求来查询相关的信息,常见的聚合函数有:

COUNT:求总数,不包含某字段为null值

SUM:     求和,不包含某字段为null值

AVG:     求平均值,不包含某字段为null值

MAX:    求最大值,适用于数值、日期、字符串类型,不包含某字段为null值

MIN:     求最小值,适用于数值、日期、字符串类型,不包含某字段为null值

聚合函数的使用是在 selec t语句中实现的,因此它的语法为:

SELECT aggregate_function(column_name) 
FROM table_name
/*
其中,aggregate_function 是聚合函数,可以是诸如 SUM()、AVG()、COUNT()、MAX()、MIN() 等函数;
column_name 是要进行聚合操作的列名;
table_name 是要查询的数据表名。
*/

示例:

创建⼀个名为 score 的课程表:

-- 创建一个课程表score
create table score(
id int,
name varchar(20),
chinese int,
math int,
english int
);-- 插入四行数据
insert into score(id,name,chinese,math,english) values
(1,'张三',77,89,56),
(2,'李四',85,98,32),
(3,'王五',67,75,64),
(4,'赵六',98,93,88);

1.1.1 count函数

count函数我们不难理解,它是用来计数的⼀个函数。通常用来记录⼀个表中的某字段出现的次数。

语法:

SELECT COUNT(column_name) 
FROM table_name
/*
其中,column_name 是要计算行数的列名,可以是具体的列名,也可以是 * 表示计算所有行数;
table_name 是要查询的数据表名。
*/
-- 使⽤count函数通过id计算总⼈数:
select count(id) from score;

通过上述代码,我们可以看到通过count这个函数可以计算到了score表中id字段的总数。

注意这里的总数是字段总个数,如果某⼀行为null则不列入计数总数当中。

1.1.2 sum函数

sum函数,是用来计算总和的函数。

使用sum函数计算score表中chinese成绩的总数:

select sum(chinese) from score;

 我们可以看到,使用sum函数可以很好的求某⼀个字段的总和。

当然在函数的后面也可以加上别名,如给sum(chinese)起别名位total:

select sum(chinese) as total from score;

 通过上述代码我们可以知道,聚合函数的后面是可以起别名的,起别名是通过as这个关键字来起的。

其中as可以省略,但建议加上该关键字这样代码的可读性较高⼀些。

1.1.3 avg函数

avg函数是用来求某⼀字段的平均值,如使用avg函数求english的平均值:

select avg(english) from score;
+--------------+| avg(english) |+--------------+| 60.0000 |+--------------+1 row in set (0.00 sec)

 通过上述代码我们可以看到,avg得到的结果默认保留了4位小数,那我们想要avg保留相应的小数可以这样做:

select round(avg(english),2) as avg from score;
+-------+| avg |+-------+| 60.00 |+-------+1 row in set (0.00 sec)

使用round函数,使得avg的结果保留相应的小数位。在上述程序中,我保留的是2位小数,大家可以根据需求自行设计。

round函数是用来做四舍入⼊操作的,当然你可以规定保留几位小数。

语法为:

select 字段 round(字段,保留位数) from 表名;

1.1.4 max函数

max函数是求得某⼀字段的最大值,如使用max函数求得math成绩的最大值:

select max(math) from score;
+-----------+| max(math) |+-----------+| 98 |+-----------+1 row in set(0.00 sec)

我们可以看到,math字段的最大值98被查询出来了,max函数的用法也是很简单。

1.1.5 min函数

通过上方讲解我们知道了max函数是求最大值的,那么min函数是求得某⼀字段的最小值。

如使用min函数求得english成绩的最小值:

select min(english) from score;
+--------------+| min(english) |+--------------+| 32 |+--------------+1 row in set (0.00 sec)

 通过上述代码可以看到,english字段的最小值32被查找出来了,min函数的使用方法也是比较简单。

2. 分组函数的注意事项:

⾸先,我们创建⼀个简易的薪资表,往后的所有函数也是通过这张表来讲解。

create table Pay(
id int,
name varchar(10),
salary decimal(10,3),
bonus decimal(10,3),
holiday int
);insert into Pay (id,name,salary,bonus,holiday) values
(1001,'Bob',2345.435,800,5),
(1002,'Tom',3454.534,500.435,2),
(1003,'Mimi',5534.565,900,10),
(1004,'Boss',10000,888.666,20),
(1005,'Ggg',2454,300,null);mysql select * from Pay;

 2.1 事项一

在mysql数据库中,在运算时如果某⼀数据为NULL。则最后的结果⼀定是空,但在分组函数进行运算时会自动忽略NULL。

select * from Pay;

 我们可以看到Pay表中假期(holiday)字段有⼀空,那么我对它进行求和会不会造成结果为空呢?

select sum(holiday) test from Pay;
+------+| test |+------+| 37 |+------+1 row in set (0.00 sec)

 我们发现并没有结果为NULL,证实了上⾯那句话,分组函数运算时忽略NULL。

2.2 事项二

分组函数中的count(*)和count(某字段)有什么区别?

count(*)是统计该字段所有数据的计数包括NULL,而count(字段)是统计除NULL以外数据的计数。

select count(*) from Pay;
+----------+| count(*) |+----------+| 5 |+----------+1 row in set(0.00 sec)select count(holiday) from Pay;
+----------------+| count(holiday) |+----------------+| 4 |+----------------+1 row in set (0.00 sec)

 因此,count(*)是通常是用来统计行数的,count(字段)是用来计数某⼀字段除NULL以外的数据。

2.3 事项三

分组函数不得直接使用在where子句中!会提示使用了无效的分组函数 。

如用条件查询找工资最大值:

select name,salary salmax from Pay where salarymin(salary);
--ERROR 1111 (HY000): Invalid use of group function

 2.4 事项四

分组函数可以联合使用,比如我要将员⼯薪资的最小值,最大值,平均值,总和,员工个数显示出来:

select min(salary) salmin,max(salary) salmax,avg(salary) salavg,sum(salary) salsum,count(*) salcou from Pay;

 附本节测试SQL

-- 创建一个课程表score
create table score(
id int,
name varchar(20),
chinese int,
math int,
english int
);-- 插入四行数据
insert into score(id,name,chinese,math,english) values
(1,'张三',77,89,56),
(2,'李四',85,98,32),
(3,'王五',67,75,64),
(4,'赵六',98,93,88);select count(id) from score;select sum(chinese) from score;select sum(chinese) as total from score;select avg(english) from score;select round(avg(english),2) as avg from score;select max(math) from score;select min(english) from score;create table Pay(
id int,
name varchar(10),
salary decimal(10,3),
bonus decimal(10,3),
holiday int
);insert into Pay (id,name,salary,bonus,holiday) values
(1001,'Bob',2345.435,800,5),
(1002,'Tom',3454.534,500.435,2),
(1003,'Mimi',5534.565,900,10),
(1004,'Boss',10000,888.666,20),
(1005,'Ggg',2454,300,NULL);select * from pay;select sum(holiday) test from Pay;select count(*) from Pay;select count(holiday) from Pay;select name,salary salmax from Pay where salarymin(salary);select min(salary) salmin,max(salary) salmax,avg(salary) salavg,sum(salary)salsum,count(*) salcou from Pay;

相关文章:

  • 入侵检测系统(IDS)与入侵防御系统(IPS):功能对比与部署实践
  • Linux-06 ubuntu 系统截图软件使用简单记录
  • 大型工程里 AI 编码困境重重,未来如何破局?
  • CodeMeter Runtime 安装失败排查与解决指南
  • Operating System 实验二 内存管理实验
  • 华硕NUC产品闪耀第31届中国国际广播电视信息网络展览会
  • 打造高功率、高电流和高可靠性电路板的厚铜PCB生产
  • Unity Shader Properties详解
  • 项目实战-基于大数据分析的暖通系统改造模型【感谢Akila公司以及学院的支持】
  • 如何通过电路测量运放的增益带宽积(GBP)和压摆率(SR)
  • 深入 Vue 核心:通信、生命周期与 API 的全面解析
  • 在 Ubuntu 22.04|20.04|18.04 上安装 PostgreSQL 13
  • Pycharm(三):梯度下降法
  • 【AI平台】n8n入门3:第二个工作流,链接网上大模型(含三种方式)
  • SQL语句练习 自学SQL网 基础查询
  • 各类前端开发的框架比较及其核心特性、开发体验、生态系统以及在不同项目中的适用性
  • 3、LangChain基础:LangChain Chat Model
  • 棋牌游戏开发核心要点解析——安全合规与架构设计实战指南
  • MoE架构解析:如何用“分治”思想打造高效大模型?
  • Kafka生产者架构深度剖析
  • 辽宁辽阳市白塔区一饭店火灾事故举行新闻发布会,现场为遇难者默哀
  • 国有六大行一季度合计净赚超3444亿,不良贷款余额均上升
  • 东风着陆场做好各项搜救准备,迎接神舟十九号航天员天外归来
  • 上汽集团一季度净利润30.2亿元,同比增长11.4%
  • 出行注意防晒补水,上海五一假期以多云天气为主最高33℃
  • 成都警方:在地铁公共区域用改装设备偷拍女乘客,男子被行拘