MySQL數(shù)據(jù)庫(kù)學(xué)習(xí)之分組函數(shù)詳解
1.分組函數(shù)
極值
找出最高工資:
mysql> select max(sal) from emp; +----------+ | max(sal) | +----------+ | 5000.00 | +----------+ 1 row in set (0.00 sec)
找出最低工資:
mysql> select min(sal) from emp; +----------+ | min(sal) | +----------+ | 800.00 | +----------+ 1 row in set (0.00 sec)
求和
將所有人的工資相加:
mysql> select sum(sal) from emp; +----------+ | sum(sal) | +----------+ | 29025.00 | +----------+ 1 row in set (0.00 sec)
平均值
求所有人的平均工資:
mysql> select avg(sal) from emp; +-------------+ | avg(sal) | +-------------+ | 2073.214286 | +-------------+ 1 row in set (0.00 sec)
列數(shù)和
計(jì)算員工數(shù)量總和:
mysql> select count(ename) from emp; +--------------+ | count(ename) | +--------------+ | 14 | +--------------+ 1 row in set (0.00 sec)
count(具體字段) 表示該字段下不為null的行數(shù)
count(*) 表示整個(gè)范圍的行數(shù),因?yàn)閿?shù)據(jù)庫(kù)表中并不存在記錄全為null的情況!
2.分組查詢
GROUP BY 語(yǔ)句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
在分組的列上我們可以使用 COUNT, SUM, AVG等函數(shù)。
GROUP BY 語(yǔ)法
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
請(qǐng)注意,在進(jìn)行關(guān)鍵字組合的時(shí)候,他們的順序是這樣的:
select ...
from ...
where ...
group by ...
order by ...
這樣的順序是不可以被更改的,且他們?cè)贛ysql內(nèi)部的執(zhí)行順序是:
from
where
group by
select
order by
注意:分組函數(shù)在進(jìn)行使用的時(shí)候要先分組才能使用
那么現(xiàn)在出現(xiàn)了一個(gè)問(wèn)題,如下語(yǔ)句看似違反了組合順序,但是它為什么是正確的呢?
select sum(sal) from emp;
因?yàn)閟elect在group by之后執(zhí)行
現(xiàn)在,我們來(lái)看一個(gè)分組查詢的示例,找出每個(gè)工作崗位的工資和:
mysql> select job,sum(sal) from emp
-> group by job;
+-----------+----------+
| job | sum(sal) |
+-----------+----------+
| CLERK | 4150.00 |
| SALESMAN | 5600.00 |
| MANAGER | 8275.00 |
| ANALYST | 6000.00 |
| PRESIDENT | 5000.00 |
+-----------+----------+
5 rows in set (0.01 sec)
找出每個(gè)部門的最高薪資:
mysql> select deptno,max(sal) from emp group by deptno; +--------+----------+ | deptno | max(sal) | +--------+----------+ | 20 | 3000.00 | | 30 | 2850.00 | | 10 | 5000.00 | +--------+----------+ 3 rows in set (0.00 sec)
以上這些都是小兒科,現(xiàn)在我們來(lái)看看如何將兩個(gè)字段進(jìn)行聯(lián)合分組:
查找每個(gè)部門不同崗位的最高薪資:
mysql> select deptno,job,max(sal)
-> from emp
-> group by deptno,job;
+--------+-----------+----------+
| deptno | job | max(sal) |
+--------+-----------+----------+
| 20 | CLERK | 1100.00 |
| 30 | SALESMAN | 1600.00 |
| 20 | MANAGER | 2975.00 |
| 30 | MANAGER | 2850.00 |
| 10 | MANAGER | 2450.00 |
| 20 | ANALYST | 3000.00 |
| 10 | PRESIDENT | 5000.00 |
| 30 | CLERK | 950.00 |
| 10 | CLERK | 1300.00 |
+--------+-----------+----------+
9 rows in set (0.00 sec)3.小練習(xí)
找出每個(gè)部門的最高薪資,要求顯示最高薪資大于3000的:
請(qǐng)注意:如果我們想要對(duì)分完組之后的數(shù)據(jù)進(jìn)行再次的過(guò)濾,需要使用having子句,having不能單獨(dú)進(jìn)行使用,必須和group by進(jìn)行聯(lián)合使用
mysql> select deptno,max(sal)
-> from emp
-> group by deptno
-> having max(sal) > 3000;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
+--------+----------+
1 row in set (0.00 sec)
如上的sql語(yǔ)句效率很低,我們嘗試進(jìn)行一個(gè)小的優(yōu)化:
mysql> select deptno,max(sal)
-> from emp
-> where sal > 3000
-> group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
+--------+----------+
1 row in set (0.00 sec)
where 和 having 請(qǐng)優(yōu)先選擇where
找出每個(gè)部門平均薪資大于2500的:
我們發(fā)現(xiàn)無(wú)法使用where實(shí)現(xiàn)此需求,這時(shí)只能使用having子句:
mysql> select deptno,avg(sal)
-> from emp
-> group by deptno
-> having avg(sal) > 2500;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 10 | 2916.666667 |
+--------+-------------+
1 row in set (0.00 sec)
4.大BOSS
找出每個(gè)崗位的平均薪資,要求顯示平均薪資大于1500的,除了MANAGER外,要求按照平均薪資降序排列:
mysql> select job,avg(sal)
-> from emp
-> where job != 'MANAGER'
-> group by job
-> having avg(sal) > 1500
-> order by avg(sal) desc;
+-----------+-------------+
| job | avg(sal) |
+-----------+-------------+
| PRESIDENT | 5000.000000 |
| ANALYST | 3000.000000 |
+-----------+-------------+
2 rows in set (0.00 sec)到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)學(xué)習(xí)之分組函數(shù)詳解的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù) 分組函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql在debian系統(tǒng)中不能插入中文的終極解決方案
在debian環(huán)境下,徹底解決mysql無(wú)法插入和顯示中文的問(wèn)題,需要的朋友可以參考下2013-09-09
解決Linux下Tomcat向MySQL插入數(shù)據(jù)中文亂碼問(wèn)題
本文給大家介紹的是如何解決win平臺(tái)下開發(fā)的項(xiàng)目移植到Linux平臺(tái)后,向MySQL插入數(shù)據(jù)時(shí)中文出現(xiàn)亂碼的問(wèn)題,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2018-04-04
MySQL隱式類型轉(zhuǎn)換導(dǎo)致索引失效的解決
本文主要介紹了MySQL隱式類型轉(zhuǎn)換導(dǎo)致索引失效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
MySQL實(shí)現(xiàn)統(tǒng)計(jì)過(guò)去12個(gè)月每個(gè)月的數(shù)據(jù)信息
這篇文章主要介紹了MySQL實(shí)現(xiàn)統(tǒng)計(jì)過(guò)去12個(gè)月每個(gè)月的數(shù)據(jù)信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
利用mysql事務(wù)特性實(shí)現(xiàn)并發(fā)安全的自增ID示例
項(xiàng)目中經(jīng)常會(huì)用到自增id,比如uid,下面為大家介紹下利用mysql事務(wù)特性實(shí)現(xiàn)并發(fā)安全的自增ID,感興趣的朋友可以參考下2013-11-11

