mysql的having和where有什麼區別

L學習不停發表於2020-12-16

having有什麼用處?

我理解的having是對已知的資料再加一層篩選,某些情況可以替代where,某些情況只能用having。

為什麼having可以替代where,下面舉個例子。

這樣查出來的語句結果都一樣,但執行邏輯是不一樣的。之前只是會用mysql,現在一看到sql語句都忍不住用explain。

從結果可以看出來,用having的語句掃描了整個資料表大概三十萬行資料,而用where只是掃描了11行。從實踐來看,這種情況下絕不要用having去代替where。having就是簡單粗暴的把表所有資料拿出來後,再把符合條件的返回。

什麼情況下只能用where,什麼情況下只能用having?

如果檢索欄位裡面沒有having的欄位就不行,比如

select author,title from poetry having id < 10;     --錯誤示例!!

select id,author,title from poetry having id < 10;  --正確示例!!
select author,title from poetry having where < 10;  --正確示例!!

為什麼錯誤,因為having就是對查詢出來的資料再篩選,沒有id而having id就是錯誤。

那麼什麼情況下必須用having而不能用where,其實就是舉一反三,比如這樣的。

SELECT author,count( author_id ) AS total FROM poetry 
 GROUP BY author where total > 30 ORDER BY total DESC; --錯誤示例!!

這條語句是要把作詩超過30首的詩人給找出來,為什麼報錯,其實原因很簡單,因為表裡面沒有total這個欄位,要正確使用的sql如下

SELECT author,count( author_id ) AS total FROM poetry
 GROUP BY author HAVING total > 30 ORDER BY total DESC;
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章