Muszę googlować w niewłaściwy sposób lub mam głupi moment.
Jaka jest różnica między HAVING
i WHERE
w SQL SELECT
oświadczeniu?
EDYCJA: Oznacziłem odpowiedź Stevena jako poprawną, ponieważ zawierała ona kluczową informację w linku:
Gdy
GROUP BY
nie jest używany,HAVING
zachowuje się jakWHERE
klauzula
Sytuacja, w której widziałem, WHERE
nie miała miejsca GROUP BY
i właśnie tam zaczęło się moje zamieszanie. Oczywiście, dopóki się tego nie dowiesz, nie możesz podać tego w pytaniu.
HAVING
jest to filtr po agregacji, podczas gdyWHERE
jest to filtr przed agregacją.Odpowiedzi:
Źródło
źródło
MAJĄCE: służy do sprawdzania warunków po agregacji.
GDZIE: służy do sprawdzania warunków przed agregacją.
Ten kod:
Daje tabelę wszystkich miast w MA i liczbę adresów w każdym mieście.
Ten kod:
Daje tabelę miast w MA z więcej niż 5 adresami i liczbą adresów w każdym mieście.
źródło
Różnica numer jeden dla mnie: gdyby
HAVING
została usunięta z języka SQL, życie trwałoby mniej więcej tak jak wcześniej. Z pewnością zapytania mniejszościowe musiałyby zostać przepisane przy użyciu tabeli pochodnej, CTE itp., Ale w rezultacie byłyby łatwiejsze do zrozumienia i utrzymania. Być może konieczne będzie przepisanie kodu optymalizującego sprzedawcę, aby uwzględnić to, co ponownie stanowi okazję do poprawy w branży.Zastanówmy się teraz przez chwilę nad usunięciem
WHERE
z języka. Tym razem większość istniejących zapytań musiałaby zostać przepisana bez oczywistej alternatywnej konstrukcji. Kodery musiałyby być kreatywne, np. Łączyć wewnętrznie do tabeli, która zawiera dokładnie jeden wiersz (np.DUAL
W Oracle), używającON
klauzuli do symulacji poprzedniejWHERE
klauzuli. Takie konstrukcje byłyby wymyślone; byłoby oczywiste, że czegoś brakowało w języku i sytuacja byłaby gorsza.TL; DR moglibyśmy stracić
HAVING
jutro i nie byłoby nic gorszego, być może lepszego, ale nie można tego samego powiedziećWHERE
.Z odpowiedzi tutaj wynika, że wielu ludzi nie zdaje sobie sprawy, że
HAVING
klauzula może być używana bezGROUP BY
klauzuli. W takim przypadkuHAVING
klauzula jest stosowana do całego wyrażenia tabeli i wymaga, aby w niej występowały tylko stałeSELECT
. ZazwyczajHAVING
klauzula będzie obejmować agregaty.Jest to bardziej przydatne niż się wydaje. Na przykład rozważ to zapytanie, aby sprawdzić, czy
name
kolumna jest unikalna dla wszystkich wartości wT
:Istnieją tylko dwa możliwe wyniki: jeśli
HAVING
klauzula jest prawdziwa, wynikiem będzie pojedynczy wiersz zawierający wartość1
, w przeciwnym razie wynikiem będzie pusty zbiór.źródło
Klauzula HAVING została dodana do SQL, ponieważ słowa kluczowego WHERE nie można było używać z funkcjami agregującymi.
Sprawdź ten link w3schools, aby uzyskać więcej informacji
Składnia:
Zapytanie takie jak to:
... można przepisać przy użyciu tabeli pochodnej (z pominięciem
HAVING
) w następujący sposób:źródło
HAVING
został dodany, ponieważ tabele pochodne nie zostały dodane do języka i dopóki nie były SQL, nie były relacyjnie kompletne, a gdy nieuchronnieHAVING
stały się zbędne.Różnica między nimi polega na relacji do klauzuli GROUP BY:
GDZIE jest przed GROUP BY; SQL ocenia klauzulę WHERE przed grupowaniem rekordów.
POSIADA po GROUP BY; SQL ocenia HAVING po grupowaniu rekordów.
Bibliografia
Instrukcja SQLite SELECT Składnia / Diagram kolejowy
Instrukcja Informix SELECT Składnia / Diagram kolejowy
źródło
SELECT 1 AS result FROM T HAVING...
- na twoim diagramie nie mogę się dostaćHAVING
bez przejścia,GROUP BY
ale moje doskonale poprawne i przydatne zapytanie nie maGROUP BY
. Drobny punkt: nie masz możliwości włączenia literalnych wartości doSELECT
klauzuli.WHERE->HAVING
części, więc myślę, że należy zwrócić szczególną uwagę na szczegóły. Jeśli uważasz, że moja odpowiedź jest błędna, edytuj ją lub dodaj sugerowaną korektę w komentarzach.HAVING
jest używany, gdy używasz agregatu, takiego jakGROUP BY
.źródło
GDZIE jest stosowane jako ograniczenie zestawu zwracanego przez SQL; wykorzystuje wbudowane operacje SQL i indeksy i dlatego jest najszybszym sposobem filtrowania zestawów wyników. Zawsze używaj GDZIE, gdy to możliwe.
HAVING jest niezbędny w przypadku niektórych filtrów agregujących. Filtruje zapytanie PO pobraniu, zmontowaniu i posortowaniu wyników przez sql. Dlatego jest znacznie wolniejszy niż GDZIE i należy go unikać, z wyjątkiem sytuacji, które tego wymagają.
SQL Server pozwoli ci uniknąć używania HAVING nawet wtedy, gdy GDZIE byłoby znacznie szybciej. Nie rób tego
źródło
Klauzula WHERE nie działa w przypadku funkcji agregujących
oznacza: nie należy używać takiej premii: nazwa tabeli
TUTAJ Zamiast używać klauzuli WHERE, musisz użyć POSIADAJĄC ..
bez użycia klauzuli GROUP BY klauzula HAVING działa jak klauzula WHERE
źródło
Różnica czarno-biała
WHERE
iHAVING
klauzula:Główną różnicą między klauzulą
WHERE
aHAVING
jest to, żeWHERE
jest używana do operacji na wierszach iHAVING
do operacji na kolumnach.Dlaczego potrzebujemy
HAVING
klauzuli?Jak wiemy, funkcje agregujące można wykonywać tylko na kolumnach, więc nie możemy używać funkcji agregujących w
WHERE
klauzuli. Dlatego używamy funkcji agregujących wHAVING
klauzuli.źródło
W zapytaniu zagregowanym (dowolne zapytanie, w którym używana jest funkcja agregująca) Predykaty w klauzuli where są oceniane przed wygenerowaniem zagregowanego pośredniego zestawu wyników,
Predykaty w klauzuli Have są stosowane do zagregowanego zestawu wyników PO wygenerowaniu go. Dlatego warunki predykatów dla wartości zagregowanych muszą być umieszczone w klauzuli Have, a nie w klauzuli Where i dlatego można używać aliasów zdefiniowanych w klauzuli Select w klauzuli Have, ale nie w klauzuli Where.
źródło
Miałem problem i odkryłem inną różnicę między
WHERE
iHAVING
. Nie działa w ten sam sposób na indeksowane kolumny.WHERE my_indexed_row = 123
pokaże wiersze i automatycznie wykona „ZAMÓWIENIE ASC” w innych indeksowanych wierszach.HAVING my_indexed_row = 123
pokazuje wszystko, od najstarszego „wstawionego” wiersza do najnowszego, bez uporządkowania.źródło
Gdy
GROUP BY
nie jest używany, klauzuleWHERE
iHAVING
są zasadniczo równoważne.Jednak gdy
GROUP BY
jest używany:WHERE
Klauzula służy do ewidencji filtracyjnych od wyniku. Filtrowanie następuje przed utworzeniem jakichkolwiek grupowań.HAVING
Klauzula jest stosowana do wartości filtrów z grupy (tj aby sprawdzić warunki po agregacji do grup została wykonana).Zasoby stąd
źródło
Jednym ze sposobów myślenia o tym jest to, że klauzula have jest dodatkowym filtrem do klauzuli where.
WHERE klauzula jest stosowana filtry rekordy od wyniku. Filtr występuje przed utworzeniem jakichkolwiek grupowań. HAVING punkt stosuje się wartości filtrów z grupy
źródło
Od tutaj .
w przeciwieństwie do klauzuli WHERE, która jest stosowana do wierszy bazy danych
źródło
HAVING
dekady po tym, jak zostało „przestarzałe” przez tabele pochodne.SELECT 1 FROM T HAVING COUNT(*) >= 1;
- nie odwołuje się do kolumn wGROUP BY
klauzuli (nie ma żadnych) ani do kolumn w funkcjach agregujących (zapytanie nie odwołuje się wcale do kolumn).Podczas pracy nad projektem było to również moje pytanie. Jak wspomniano powyżej, HAVING sprawdza warunek na już znalezionym wyniku zapytania. Ale GDZIE służy do sprawdzania warunku podczas wykonywania zapytania.
Podam przykład, który to zilustruje. Załóżmy, że masz taką tabelę bazy danych.
Załóżmy, że następujące wiersze znajdują się w tabeli:
Teraz chcemy dostać
userid
s isum(dailyincome)
czyjesum(dailyincome)>100
Jeśli napiszemy:
To będzie błąd. Prawidłowe zapytanie to:
źródło
Klauzula WHERE służy do porównywania wartości w tabeli podstawowej, natomiast klauzula HAVING może być używana do filtrowania wyników funkcji agregujących w zestawie wyników zapytania Kliknij tutaj !
źródło
Używam HAVING do ograniczenia zapytania w oparciu o wyniki funkcji agregującej. EG wybierz * w grupie blahblahblah przez COŚ mając liczbę (COŚ)> 0
źródło
Może być tak, że tematem „gdzie” jest rząd, podczas gdy tematem „posiadania” jest grupa. Czy mam rację?
źródło