Różnica numer jeden dla mnie: gdyby HAVINGzostał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 WHEREz 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. DUALW Oracle), używając ONklauzuli do symulacji poprzedniej WHEREklauzuli. 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ć HAVINGjutro 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 HAVINGklauzula może być używana bez GROUP BYklauzuli. W takim przypadku HAVINGklauzula jest stosowana do całego wyrażenia tabeli i wymaga, aby w niej występowały tylko stałe SELECT. Zazwyczaj HAVINGklauzula będzie obejmować agregaty.
Jest to bardziej przydatne niż się wydaje. Na przykład rozważ to zapytanie, aby sprawdzić, czy namekolumna 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 HAVINGklauzula jest prawdziwa, wynikiem będzie pojedynczy wiersz zawierający wartość 1, w przeciwnym razie wynikiem będzie pusty zbiór.
HAVINGjest to filtr po agregacji, podczas gdyWHEREjest to filtr przed agregacją.