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;