mysql中having和where的區別

讓咱們先運行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不推薦。並且也沒有明確說明緣由,可是既然它要求,咱們遵循就能夠了。

相關文章
相關標籤/搜索