天天看點

group by having用法_MySQL查詢中having語句的使用場景和用法

有成績表如下,表名稱是sc,字段s_id是學生編号,c_id是課程編号,score是課程成績:

group by having用法_MySQL查詢中having語句的使用場景和用法

在上篇文章中介紹了group by語句的用法,文章連結:

曹亮:MySQL查詢中group by語句的使用場景和用法​zhuanlan.zhihu.com

group by having用法_MySQL查詢中having語句的使用場景和用法

having語句是分組後過濾的條件,在group by之後使用,也就是如果要用having語句,必須要先有group by語句。

group by的功能是分組聚合,将多條記錄變成比較少的記錄,而having的功能是由多變少之後,再變少的過程。

另外having後面可以跟多種運算形式,但是運算的結果隻能是一個邏輯值(0或者非0的數值)。 題目1:求平均成績>=60分的學生編号及平均成績

整體思路如下:

1.看是否有條件,如果條件是從資料庫擷取資料時的篩選條件,應該用where語句;如果是分組聚合之後的條件,應該用having語句。本題的條件是平均成績>=60,平均成績是聚合的結果,應屬于聚合後的條件,應該使用having語句;

2.先不考慮having語句,将分組聚合語句寫出:

select s_id,avg(score) 平均成績 from sc group by s_id;

3.将過濾條件加在group by後面,完整語句:select s_id,avg(score) 平均成績 from sc group by s_id

having avg(score)>=60

;

資料運算的過程如下:

1.根據s_id,把資料分成7各組,2.根據having後面的條件,判斷每個組是否滿足,3.滿足的組輸出指定字段,不滿足的組不輸出。

group by having用法_MySQL查詢中having語句的使用場景和用法
題目2:查詢至少兩門課程及格的學生學号 分析題意:

輸出學生學号,條件是至少兩門課程及格,從方法論上看,最後輸出的結果是小于等于7條的,記錄是由多變少再表少的過程,應該用having語句。

另外條件是每位同學及格的課程數量>=2,及格的課程數量可以用sum(score>=60)來表示,score>=60,滿足的傳回1,不滿足的傳回0,最後進行求和,得到的是及格的課程數量,sum(score)>=60涉及到聚合,條件應該放在having後面。

最後的語句:

select s_id from sc group by s_id having sum(score>=60)>=2; 資料運算的過程如下:1.

根據s_id,把資料分成7各組,

2.

根據having後面的條件,判斷score>=60,滿足的傳回1,不滿足傳回0,

3.

針對score>=60的結果進行求和,在和2作比較,sum(score>=60)>=2,滿足的傳回1,不滿足傳回0,

4.

滿足的組輸出指定字段,不滿足的組不輸出。

group by having用法_MySQL查詢中having語句的使用場景和用法
題目3:查詢僅學過01和02号課程的學生編号 分析題意:

根據方法論,最後結果的記錄是小于等于7條的,而成績表有18條記錄,是由多變少再變少的過程,需要使用having語句,先不用考慮having的條件,把前面的語句先寫完:

select s_id from sc group by s_id;

再考慮having後面的條件,僅學過01和02課程,可以把條件分為3個,一是學過01,而是學過02,三是隻學了兩門課,滿足這三個條件,就說明僅學了01和02。三個條件通過and連接配接,語句如下:select s_id from sc group by s_id having

count(c_id)=2 and sum(c_id="01")=1 and sum(c_id="02")=1;

滿足count(c_id)=2 這個條件說明隻學了兩門課,滿足sum(c_id="01")=1這個條件說明學過01号課程,滿足sum(c_id="02")=1這個條件說明學過02号課程。

------------------------------------------------------------------------------

關于having語句的用法先介紹這麼多,根據不同的需求,having後面的用法是多種多樣的,例如結合group_concat()函數等,更多的内容在後面的文章繼續介紹,歡迎關注我的知乎~