讓咱們先運行2個sql語句: mysql
一、SELECT * FROM `welcome` HAVING id >1 LIMIT 0 , 30
二、SELECT * FROM `welcome` WHERE id >1 LIMIT 0 , 30
sql
查看一下結果吧,怎麼樣?是否是查詢到相同的結果。 函數
讓咱們再看2個sql語句: code
一、SELECT user, MAX(salary) FROM users GROUP BY user HAVING MAX(salary)>10;
二、SELECT user, MAX(salary) FROM users GROUP BY user WHERE MAX(salary)>10;
開發
怎麼樣?看出差異了嗎,第一個sql語句能夠正常運行【舊版mysql可能會出錯】,而第二個則會報錯。 擴展
看了2個實例以後,咱們再來看mysql手冊中對having語句的說明: sql語句
一、SQL標準要求HAVING必須引用GROUP BY子句中的列或用於總計函數中的列。不過,MySQL支持對此工做性質的擴展,並容許HAVING涉及SELECT清單中的列和外部子查詢中的列。 引用
二、HAVING子句必須位於GROUP BY以後ORDER BY以前。 查詢
三、若是HAVING子句引用了一個意義不明確的列,則會出現警告。在下面的語句中,col2意義不明確,由於它既做爲別名使用,又做爲列名使用:mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2; 開發者
標準SQL工做性質具備優先權,所以若是一個HAVING列名既被用於GROUP BY,又被用做輸出列清單中的起了別名的列,則優先權被給予GROUP BY列中的列。
四、HAVING子句能夠引用總計函數,而WHERE子句不能引用。【這應該是開發者在特定的狀況下采用HAVING子句的最大緣由】
五、不要將HAVING用於應被用於WHERE子句的條目,從咱們開頭的2條語句來看,這樣用並無出錯,可是mysql不推薦。並且也沒有明確說明緣由,可是既然它要求,咱們遵循就能夠了。