WHERE子句:
在分組之前使用,表示從所有數據中根據條件篩選出部分數據,以完成分組的要求.
在一個WHERE子句中使用列別名是不允許的,因為當執行WHERE子句時,列值可能還沒有被確定。
在WHERE子句中,您可以使用MySQL支持的所有函數,不過總計(總結)函數除外
HAVVING子句:
在分組之后使用的,表示對分組統計后的數據執行再次過濾,可以使用
一個HAVING子句必須位於GROUP BY子句之后,並位於ORDER BY子句之前
HAVING子句基本上是最后使用,只位於被發送給客戶端的條目之前,沒有進行優化。(LIMIT用於HAVING之后。)
SQL標准要求HAVING必須引用GROUP BY子句中的列或用於總計函數中的列。不過,MySQL支持對此工作性質的擴展,並允許HAVING引用SELECT清單中的列和外部子查詢中的列。
如果HAVING子句引用了一個意義不明確的列,則會出現警告。在下面的語句中,col2意義不明確,因為它既作為別名使用,又作為列名使用:
mysql> SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
標准SQL工作性質具有優先權,因此如果一個HAVING列名既被用於GROUP BY,又被用作輸出列清單中的起了別名的列,則優先權被給予GROUP BY列中的列。
區別:
HAVING不能用於應被用於WHERE子句的條目。例如,不能編寫如下語句:
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
而應這么編寫:
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
但是HAVING子句可以引用總計函數,而WHERE子句不能引用:
mysql> SELECT user, MAX(salary) FROM users
-> GROUP BY user HAVING MAX(salary)>10;
