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ąc ON
klauzuli do symulacji poprzedniej WHERE
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 bez GROUP BY
klauzuli. W takim przypadku HAVING
klauzula jest stosowana do całego wyrażenia tabeli i wymaga, aby w niej występowały tylko stałe SELECT
. Zazwyczaj HAVING
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 w T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
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.
HAVING
jest to filtr po agregacji, podczas gdyWHERE
jest to filtr przed agregacją.