MySQL中SELECT子句WHERE和HAVING的區別


 

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM