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 協議》,轉載必須註明作者和本文連結