sql語句中where和having的區別(sql where having區別)

WHERE和HAVING子句之間的主要區別在于與GROUP BY子句一起使用時,在這種情況下,WHERE用于在分組之前過濾行,HAVING用于在分組后排除記錄。這是最重要的區別,如果你還記得這個,它將幫助你編寫更好的SQL查詢。這也是要理解的重要SQL概念之一,不僅從面試角度而且從日常使用角度來理解。我確信您已經使用了WHERE子句,因為它是SQL中最常見的子句之一以及SELECT,用于指定過濾條件或條件。您甚至可以使用WHERE子句而不使用HAVING或GROUP BY,因為您已多次看到它。
孩子學習?對于所有的家長來,最關心就是孩子的學習,對吧?如何幫孩子提升學習成績呢?影響孩子學習成績的因素有哪些?左養右學教育賴頌強團隊13年的家庭教育服務經驗總結,影響孩子學習的主要因素有22條之多,家長你了解幾條呢?
另一方面,只有在SQL查詢中使用GROUP BY子句執行分組時才能使用HAVING。關于WHERE和HAVING子句的另一個值得注意的事情是WHERE子句不能包含聚合函數,如COUNT(),SUM(),MAX(),MIN()等,但HAVING子句可能包含聚合函數。
另一個值得注意的是WHERE和HAVING子句之間的區別在于,WHERE用于對SELECT,UPDATE,DELETE語句以及單行函數強加過濾條件,并在group by子句之前使用,但HAVING總是在group by子句之后使用。
SQL中WHERE與HAVING的區別
1)在查詢處理的邏輯順序中,在FROM子句之后立即處理WHERE子句,這意味著它在GROUP BY子句之前處理,而在創建組之后執行HAVING子句。
2)如果在GROUP BY中使用,您可以在WHERE子句中引用表中的任何列,但是您只能使用未分組或聚合的列。
3)如果你使用沒有group by的HAVING子句,它也可以引用任何列,但不會使用索引而不是WHERE子句。例如,以下具有相同的結果集,但是“where”將使用id索引并且將執行表掃描
select * from table where id=1
select * from table id=1
4)您可以使用聚合函數來過濾具有HAVING子句的行。因為在對行進行分組后處理HAVING子句,所以可以在邏輯表達式中引用聚合函數。例如,以下查詢將僅顯示具有10個以上學生的
課程:SELECT課程,COUNT(課程)為培訓GROUP BY課程的NumOfStudent課程計數(課程)> 10
5)WHERE和HAVING子句之間的另一個關鍵區別是在哪里使用Index和HAVING都不會,例如以下兩個查詢會產生相同的結果但是WHERE會使用Index和HAVING會做一個表掃描
SELECT * FROM Course WHERE Id=101;
SELECT * FROM Course HAVING Id=102;
6)由于在組形成之前評估WHERE子句,因此它會對每行進行求值。另一方面,在形成組之后評估HAVING子句,因此它評估每組。
何時使用WHERE和HAVING子句?
雖然兩者都用于從結果集中排除行,但您應該在分組之前使用WHERE子句過濾行,并在分組后使用HAVING子句過濾行。換句話說,WHERE可用于過濾表列,而HAVING可用于過濾聚合函數,如count,sum,avg,min和max。
如果可以在沒有聚合函數的情況下完成過濾,則必須在WHERE子句上執行此操作,因為它可以提高性能,因為計數和排序將在更小的集合上完成。如果在分組后過濾相同的行,則會不必要地承擔未使用的排序成本。
例如,以下語句在語法上是正確的并產生相同的結果,但第二個語句比第一個語句更有效,因為它在分組之前過濾行:
SELECT Job,City,State,Count(Employee)from … HAVING …
SELECT ….. from … WHERE …
這就是SQL中WHERE和HAVING子句之間的區別。這些差異適用于幾乎所有主要數據庫,例如MySQL,Oracle,SQL Server和PostgreSQL。請記住,WHERE用于在分組之前過濾行,而HAVING用于在分組后過濾行。您還可以使用AGGREGATE函數和HAVING子句進行過濾。