使用mysql語(yǔ)句對(duì)分組結(jié)果進(jìn)行再次篩選方式
1 作用
對(duì)分組結(jié)果進(jìn)行再一次的篩選,就需要使用在GROUP BY子句中接上HAVING 子句。
例如:
求在員工表emp中求部門中的員工的最高工資大于2000的部門編號(hào)和最高工資,就得用上HAVING子句,用WHERE子句是不能直接操作分組函數(shù)的,因?yàn)橐确纸M了才可以使用分組函數(shù)。
2 如何用
2.1 本質(zhì)
對(duì)分組結(jié)果進(jìn)行篩選,篩選之后SELECT的子句中的分組函數(shù)就可以拿到篩選之后的數(shù)據(jù)了
其實(shí),簡(jiǎn)單來(lái)說(shuō),HAVING子句就是在SELECT子句中有分組函數(shù)的情況下,在SELECT子句執(zhí)行前,提前使用分組函數(shù)過(guò)濾掉了一些不需要的數(shù)據(jù),
當(dāng)然在HAVING子句也可以過(guò)濾分組字段,但是過(guò)濾分組字段的某些值的最優(yōu)解法就是在WHERE子句里面進(jìn)行過(guò)濾
HAVING子句只對(duì)分組結(jié)果進(jìn)行再次過(guò)濾
2.2 語(yǔ)法
SELECT
分組字段,分組函數(shù)(想要匯總/計(jì)算的字段)FROM
表名GROUP BY
分組字段HAVING
分組函數(shù)(想要匯總/計(jì)算的字段) 比較運(yùn)算符 常量;
2.3 示例sql語(yǔ)句
SELECT deptno,MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal)>3000; /* 查詢中員工表中部門員工最高工資大于3000的部門編號(hào)和最高薪水 */
2.4 分析過(guò)程
a 分組
按照deptno字段可以把emp表分為三組(分組是沒(méi)有先后順序的,誰(shuí)是第一組都行)
分組的數(shù)據(jù)的標(biāo)題(EMPNO,ENAME…)實(shí)際上只是為了看的更清楚,它實(shí)際并不參與分組的
第一組 10,對(duì)應(yīng)的數(shù)據(jù)如下所示
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
---|---|---|---|---|---|---|---|
7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
第二組 20,對(duì)應(yīng)的數(shù)據(jù)如下所示
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
---|---|---|---|---|---|---|---|
7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
第三組 30 對(duì)應(yīng)的數(shù)據(jù)如下所示
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
---|---|---|---|---|---|---|---|
7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
b 找最大值
- b.1 第一組 10中的最大值為5000
- b.2 第二組 20中的最大值為3000
- b.3 第三組 30中的最大值為2850
c 僅把最大值大于3000的部門留下,另外的全部篩選掉
那么就只剩下了部門編號(hào)為10的部門,部門中的最高工資為5000
deptno | max(sal) |
---|---|
10 | 5000.00 |
d 最后查詢出來(lái)的結(jié)果就只剩下部門編號(hào)為10的部門以及它的最高工資了
2.5 示例sql語(yǔ)句運(yùn)行截圖
3 注意點(diǎn)
3.1 HAVING子句中只能存在
分組字段、常數(shù)或者分組函數(shù),不能出現(xiàn)非分組字段
3.1.1 錯(cuò)誤sql示例語(yǔ)句
SELECT deptno,MAX(sal) FROM emp GROUP BY deptno HAVING job='SALESMAN';
3.1.2 錯(cuò)誤sql示例語(yǔ)句運(yùn)行截圖
3.2 有了HAVING子句的整體執(zhí)行順序
3.2.1 FROM子句---->WHERE子句---->GROUP BY子句---->HAVING子句---->SELECT子句---->ORDER BY子句
3.2.2 從左往右按照順序依次執(zhí)行
3.2.3 若其中某一個(gè)子句沒(méi)有,就會(huì)往后找有的子句,然后按照順序依次執(zhí)行
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫(kù)/表的基礎(chǔ)操作教程
DBeaver是一款功能強(qiáng)大的數(shù)據(jù)庫(kù)管理工具,支持創(chuàng)建多種數(shù)據(jù)庫(kù),包括達(dá)夢(mèng)數(shù)據(jù)庫(kù),這篇文章主要給大家介紹了關(guān)于DBeaver連接本地MySQL并創(chuàng)建數(shù)據(jù)庫(kù)/表的基礎(chǔ)操作教程,需要的朋友可以參考下2024-02-02update.where無(wú)索引導(dǎo)致MySQL死鎖問(wèn)題解決
這篇文章主要為大家介紹了update.where無(wú)索引導(dǎo)致MySQL死鎖問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11MySQL與PHP的基礎(chǔ)與應(yīng)用專題之索引
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL?AB?公司開(kāi)發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL?是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一,本系列將帶你掌握php與mysql的基礎(chǔ)應(yīng)用,本篇從索引開(kāi)始2022-02-02mysql主從基于docker和django實(shí)現(xiàn)讀寫分離
這篇文章主要介紹了mysql主從基于docker和django實(shí)現(xiàn)讀寫分離,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-08-08Mysql 實(shí)現(xiàn)字段拼接的三個(gè)函數(shù)
這篇文章主要介紹了Mysql 實(shí)現(xiàn)字段拼接的三個(gè)函數(shù),幫助大家更好的理解和使用MySQL 數(shù)據(jù)庫(kù),感興趣的朋友可以了解下2020-11-11