Jaka jest różnica między Gdzie a posiadaniem klauzul?

w tym artykule dowiedz się, kiedy używać gdzie i mając. Oba pełnią podobne funkcje, ale do różnych celów!

wszystkie przykłady tego artykułu są oparte na Microsoft SQL Server Management Studio i Bazie Danych AdventureWorks2012. Możesz zacząć korzystać z tych bezpłatnych narzędzi, korzystając z mojego przewodnika Pierwsze kroki przy użyciu SQL Server.

Jak to gdzie i gdzie?

podczas pracy z bardziej zaawansowanym SQL może być niejasne, kiedy sensowne jest użycie klauzuli WHERE vs HAVING.

chociaż wydaje się, że obie klauzule robią to samo, robią to na różne sposoby. W rzeczywistości ich funkcje wzajemnie się uzupełniają.

  • zastosowana klauzula WHERE filtruje rekordy z wyniku. Filtr występuje przed wykonaniem jakichkolwiek grup.
  • klauzula HAVING jest używana do filtrowania wartości z grupy.

zanim przejdziemy dalej, przejrzyjmy format instrukcji SQL. Jest to

SELECTFROMWHEREGROUP BYHAVING

aby pomóc zachować rzeczy prosto lubię myśleć o kolejności wykonywania poleceń SQL od góry do dołu. Oznacza to, że klauzula WHERE jest najpierw zastosowana do wyniku, a następnie pozostałe wiersze podsumowane zgodnie z grupą przez.

klauzula WHERE

klauzula WHERE służy do filtrowania wierszy z wyników. Na przykład

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail

zwraca 121,317 jako liczbę, podczas gdy zapytanie

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200

zwraca 48,159 jako liczbę. Wynika to z klauzuli WHERE, która odfiltrowuje z wyników 73,158 SalesOrderDetails, których cena jednostkowa jest mniejsza lub równa 200.

klauzula HAVING

klauzula HAVING służy do filtrowania wartości w grupie według. Możesz ich użyć do odfiltrowania grup, takich jak

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000

, ale ich prawdziwa moc polega na możliwości porównywania i filtrowania na podstawie zagregowanych wyników funkcji. Na przykład możesz wybrać wszystkie zamówienia o łącznej wartości większej niż $10,000

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

ponieważ widoczność klauzuli WHERE jest jednym wierszem na raz, nie ma sposobu, aby obliczyć sumę we wszystkich SalesOrderID. klauzula HAVING jest obliczana po utworzeniu grupowania.

: WHERE I HAVING

gdy instrukcje SQL mają zarówno klauzulę WHERE, jak i klauzulę HAVING, należy pamiętać, że najpierw stosowana jest klauzula WHERE, następnie wyniki grupowane, a na koniec grupy filtrowane zgodnie z klauzulą HAVING.

w wielu przypadkach możesz umieścić warunek WHERE w klauzuli HAVING, na przykład

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND SalesOrderID > 50000

kontra

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE SalesOrderID > 50000GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

jeśli możesz umieścić warunek z klauzuli where w klauzuli having, to po co się martwić o gdzie? Mogę użyć tego zapytania?

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10

w rzeczywistości to zapytanie generuje błąd. Kolumna LineTotal nie jest częścią listy group by field ani wynikiem łącznej sumy.

aby była ważna, klauzula having może porównywać wyniki funkcji zagregowanych lub części Kolumnowej grupy tylko według.

aby było poprawne, zapytanie musi zostać przepisane jako

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

, aby podsumować różnicę między tym, gdzie I O:

  • WHERE służy do filtrowania rekordów przed rozpoczęciem grupowania.
  • HAVING służy do filtrowania wartości po ich grupowaniu. Tylko kolumny lub wyrażenia w grupie mogą być zawarte w Warunkach klauzuli HAVING…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

More: