寫在最前面的話
????????哈嘍,寶子們,今天給大家?guī)淼氖荕ySql數(shù)據(jù)庫(kù)的聚合查詢。在前面CRUD章節(jié)我們學(xué)習(xí)了表達(dá)式查詢,表達(dá)式查詢是針對(duì)列和列之間進(jìn)行運(yùn)算的,那么如果想在行和行之間進(jìn)行運(yùn)算,那么就需要用到聚合查詢。聚合查詢除了包含聚合函數(shù)外(count,sum,avg,max,min),還包含group by 和 having 語(yǔ)句。接下來讓我們一起進(jìn)入學(xué)習(xí)吧,感謝大家的支持!喜歡的話可以三連哦~~~
目錄
一、聚合函數(shù)
1、COUNT([DISTINCT]expr)
2、SUM([DISTINCT]expr)
3、AVG([DISTINCT]expr)
4、MAX([DISTINCT]expr)
5、MIN([DISTINCT]expr)
二、GROUP BY子句
三、HAVING子句
一、聚合函數(shù)
? ? ? ??常見的統(tǒng)計(jì)總數(shù)、計(jì)算平局值等操作,可以使用聚合函數(shù)來實(shí)現(xiàn),常見的聚合函數(shù)有:
函數(shù) | 說明 |
COUNT([DISTINCT]expr) | 返回查詢到的數(shù)據(jù)的 數(shù)量 |
SUM([DISTINCT]expr) | 返回查詢到的數(shù)據(jù)的 總和,不是數(shù)字沒有意義 |
AVG([DISTINCT]expr) | 返回查詢到的數(shù)據(jù)的 平均值,不是數(shù)字沒有意義 |
MAX([DISTINCT]expr) | 返回查詢到的數(shù)據(jù)的 最大值,不是數(shù)字沒有意義 |
MIN([DISTINCT]expr) | 返回查詢到的數(shù)據(jù)的 最小值,不是數(shù)字沒有意義 |
插入測(cè)試表
????????為了大家更好的學(xué)習(xí)聚合函數(shù),我們?cè)趯W(xué)習(xí)前先創(chuàng)建一張測(cè)試表并插入數(shù)據(jù),下面的學(xué)習(xí)案例都通過這張表舉例子:
--創(chuàng)建考試成績(jī)表
CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
);
-- 插入測(cè)試數(shù)據(jù)
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孫悟空', 87.5, 78, 77),
(3,'豬悟能', 88, 98, 90),
(4,'曹孟德', 82, 84, 67),
(5,'劉玄德', 55.5, 85, 45),
(6,'孫權(quán)', 70, 73, 78.5),
(7,'宋公明', 75, 65, 30);
1、COUNT([DISTINCT]expr)
把數(shù)據(jù)表中的數(shù)據(jù)數(shù)量進(jìn)行匯總,返回匯總的結(jié)果。
語(yǔ)法:
select count(表達(dá)式) from 表名;--表達(dá)式可為*或列名
學(xué)習(xí)案例
*:
select count(*) from exam_result;--使用*
執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
列名:
select count(name) from exam_result;--使用列名
?執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
拓展知識(shí):大家會(huì)發(fā)現(xiàn)使用列名與使用*號(hào)達(dá)到的效果是一樣的,但其實(shí)如果當(dāng)前列為NULL,使用列名就不會(huì)計(jì)算進(jìn)去,而使用*號(hào)就會(huì)。
當(dāng)插入一條name為NULL的數(shù)據(jù),再次運(yùn)行結(jié)果如下圖所示:
?distinct:
select count(distinct name) from exam_result;--使用distinct去重
執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
?2、SUM([DISTINCT]expr)
把這一列的若干行進(jìn)行求和(算術(shù)運(yùn)算),只能針對(duì)數(shù)字類型使用。
語(yǔ)法:
select sum(表達(dá)式) from 表名;--表達(dá)式為列名
?學(xué)習(xí)案例
---計(jì)算所有同學(xué)的語(yǔ)文成績(jī)
select sum(chinese) from exam_result;--如果數(shù)據(jù)中有null會(huì)被排除掉
---計(jì)算所有科目的總成績(jī)
select sum(chinese+math+english) from exam_result;--如果數(shù)據(jù)中有null會(huì)被排除掉
?3、AVG([DISTINCT]expr)
把這一列的若干行進(jìn)行平均值運(yùn)算(算術(shù)運(yùn)算),只能針對(duì)數(shù)字類型使用。
語(yǔ)法:
select avg(表達(dá)式) from 表名;--表達(dá)式為列名
?學(xué)習(xí)案例
---計(jì)算數(shù)學(xué)成績(jī)的平均值
select avg(math) from exam_result;
---計(jì)算所有科目總成績(jī)的平均值
select avg(chinese+math+english) from exam_result;
?4、MAX([DISTINCT]expr)
把這一列的若干行進(jìn)行求最大值(算術(shù)運(yùn)算),只能針對(duì)數(shù)字類型使用。
?語(yǔ)法:
select max(表達(dá)式) from 表名;--表達(dá)式為列名
學(xué)習(xí)案例
---計(jì)算英語(yǔ)成績(jī)的最大值
select max(exglish) from exam_result;
---計(jì)算所有科目總成績(jī)的最大值
select max(chinese+math+english) from exam_result;
5、MIN([DISTINCT]expr)
把這一列的若干行進(jìn)行求最小值(算術(shù)運(yùn)算),只能針對(duì)數(shù)字類型使用。
語(yǔ)法:
select min(表達(dá)式) from 表名;--表達(dá)式為列名
?學(xué)習(xí)案例
---計(jì)算數(shù)學(xué)成績(jī)的最小值
select min(math) from exam_result;
---計(jì)算所有科目總成績(jī)的最小值
select min(chinese+math+english) from exam_result;
二、GROUP BY子句
插入測(cè)試表
為了大家更好的學(xué)習(xí)group by,我們?cè)趯W(xué)習(xí)前先創(chuàng)建一張測(cè)試表并插入數(shù)據(jù),下面的學(xué)習(xí)案例都通過這張表舉例子:
---創(chuàng)建員工表
create table emp(
id int primary key auto_increment,
name varchar(20),
role varchar(20),
salary int);
---插入數(shù)據(jù)
insert into emp values(null,'張三','程序員',1688);
insert into emp values(null,'李四','程序員',1888);
insert into emp values(null,'王五','程序員',1988);
insert into emp values(null,'趙六','產(chǎn)品經(jīng)理',168);
insert into emp values(null,'田七','產(chǎn)品經(jīng)理',188);
insert into emp values(null,'周八','老板',8888);
?group by是針對(duì)指定的列進(jìn)行分組,把這一列中值相同的行分到一組中再分別使用聚合函數(shù)。
語(yǔ)法:
select 列名,聚合函數(shù) from 表名 group by 列名;
?學(xué)習(xí)案例
---計(jì)算不同職務(wù)的平均工資
select role,avg(salary) from emp group by role;--先分組,再算平均值
執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
拓展知識(shí):如果只分組不使用聚合函數(shù)可能無法得到準(zhǔn)確數(shù)據(jù),會(huì)得到每組的第一條記錄(如下圖所示)。
三、HAVING子句
group by 子句進(jìn)行分組以后,需要對(duì)分組結(jié)果再進(jìn)行條件過濾時(shí),不能使用 where語(yǔ)句,而需要用having。
語(yǔ)法:
select 列名,聚合函數(shù) from 表名 group by 列名;
?學(xué)習(xí)案例:
使用group by的時(shí)候還可以搭配其它條件,但是需要區(qū)分清楚該條件是在分組前的條件還是分組后的條件。
?---查詢每個(gè)崗位的平均工資,但是排除張三(分組之前)
select role,avg(salary) from emp where name!='張三' group by role; ---先進(jìn)行where篩選,再根據(jù)role分組,最后使用avg算平均
執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
---查詢每個(gè)崗位的平均工資,但排除平均工資超過2k的結(jié)果(分組之后)
select role,avg(salary) from emp group by role having avg(salary)<2000;
執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
拓展知識(shí):在group by中可以一條sql語(yǔ)句完成上述兩者的條件篩選。
---查詢每個(gè)崗位的平均工資,但是排除張三并保留平均值<2k的結(jié)果
select role,avg(salary) from emp where name!='張三' group by role having avg(salary)<2000;
執(zhí)行上述SQL語(yǔ)句后,運(yùn)行結(jié)果如下圖所示:?
文章來源:http://www.zghlxwxcb.cn/news/detail-703912.html
????????希望各位讀者閱讀后都能有所收獲,如果喜歡本篇博客的可以點(diǎn)贊+關(guān)注+收藏?。?!同時(shí)也歡迎各位大神如果在閱讀過程中發(fā)現(xiàn)文章有錯(cuò)誤也可私信指正錯(cuò)誤,我們下一篇博客再見~~~?文章來源地址http://www.zghlxwxcb.cn/news/detail-703912.html
到了這里,關(guān)于【MySql】數(shù)據(jù)庫(kù)的聚合查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!