區別
唯一區別是為了區別where:其實是where只能跟着from后,having只能跟着group by后。
即:
having是對一個表的數據進行了分組之后,對“組信息”進行相應 條件篩選;
可見:
having篩選時,只能根據select子句中可出現的字段(數據)來進行條件設定。
having子句與where子句一樣,都是用於條件判斷的。
區別1
where是判斷數據從磁盤讀入內存的時候
having是判斷分組統計之前的所有條件
區別2
having子句中可以使用字段別名,而where不能使用
區別3
having能夠使用統計函數,但是where不能使用
一、MySQL的group by語句
1、group by是將具有相同的進行分組,化成一塊數據集合,之后配合聚合函數進行數據處理。比如:全校學生成績表(學號,姓名,班級,成績….),現在我需要將按照相同的班級進行分類,之后計算出每個班的最高的成績。
(1)創建好student_score表
SID SNAME CLASS total_score
(2)按照班級進行分類:以班級分類為主
按照班級分類:計算出每個班的最高的成績。
select CLASS, SNAME from student_score group by CLASS, SNAME;
select CLASS, MAX(TOTAL_SCORES) AS TOP from student_score group by CLASS;
2、group by需要注意的幾點
-
group by語句通常配合聚合函數SUM、MAX、MIN等使用處理數據。
-
group by語句中使用的聚合函數處理數據是group by分組完畢之后聚合函數是對分組數據進行處理的,不是對整個表。比如group by之后一班的成績有250、251、253、254。聚合函數MAX()是針對一班這四個數據計算的。並不是MAX()整個表。
-
select后面的查詢字段要包含在group by后面的字段中。
select后面的列要包含在group by后面的列中。
二、MySQL的having語句
1、having與where的區別
(1)where:
- 是作用在查詢結果進行分組之前,過濾掉不符合條件的數據。
- where中不能包含聚合函數。(注意是:where后面子句不能有聚合函數,而在含有where中可以使用聚合函數)
- 作用在group by和having字句前
- 是作用於對表與視圖
(2)having:
-
是作用在查詢結果分組之后,篩選滿足條件的組,過濾掉數據。
-
通常跟聚合函數一起使用。
-
having子句在聚合后對組記錄進行篩選。
-
是作用於分組
2、使用having例子
(1)計算出每個班級的總成績
SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS;
(2)篩選出總成績大於505的班級
SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>505;
這里用where SUM(TOTAL_SCORES)>505的話,將會出錯,因為表中根本沒有總成績分數這項,這是分組之后才有的
3、使用having與where聯立的例子
利用having與where聯立查詢
實例:查詢班級中分數大於250的學生的總成績大於531的班級有哪幾個班。
執行順序為:
開始 -> where行記錄篩選 -> group by分組 -> 聚合函數(sum、max、min)計算 -> having分組篩選->結束
具體的如下:
- where篩選學生成績大於250的所有學生。
- group by分組班級
- sum計算分組班級中學生的總分數
- having篩選總成績大於531的班級
具體代碼如下:
-- 1.WHERE篩選出分數大於250的學生
SELECT CLASS,SNAME,TOTAL_SCORES FROM student_score WHERE TOTAL_SCORES>250;
-- 4.SUM計算之后,having篩選總成績大於531的分組
SELECT CLASS,SUM(TOTAL_SCORES) AS SUM_SCORE FROM student_score
WHERE TOTAL_SCORES>250
GROUP BY CLASS HAVING SUM(TOTAL_SCORES)>531;
