Mając (SQL)
Klauzula HAVING
w języku SQL określa, że instrukcja SQL SELECT
może zwracać tylko te wiersze, w których wartości zagregowane spełniają określone warunki .
HAVING
i WHERE
są często mylone przez początkujących, ale służą innym celom. WHERE
jest uwzględniane na wcześniejszym etapie wykonywania zapytania, filtrując wiersze odczytane z tabel. Jeśli zapytanie zawiera GROUP BY
, wiersze z tabel są grupowane i agregowane. Po operacji agregacji funkcja HAVING
, która odfiltrowuje wiersze niespełniające określonych warunków. Dlatego WHERE
dotyczy danych odczytywanych z tabel, a HAVING
powinno dotyczyć tylko danych zagregowanych, które nie są znane na początkowym etapie zapytania.
Aby wyświetlić obecny warunek utworzony przez klauzulę GROUP BY
, używana jest klauzula HAVING
. [ wymagane wyjaśnienie ]
Przykłady
Aby zwrócić listę identyfikatorów działów, których łączna sprzedaż przekroczyła 1000 USD w dniu 1 stycznia 2000 r., wraz z sumą ich sprzedaży w tym dniu:
SELECT DeptID , SUMA ( SprzedażKwota ) FROM Sales WHERE SaleDate = '01-Jan-2000' GROUP BY DeptID HAVING SUM ( SaleAmount ) > 1000
Odwołując się do przykładowych tabel w przykładzie Join , poniższe zapytanie zwróci listę działów, które mają więcej niż 1 pracownika:
SELECT Nazwa działu , LICZBA ( * ) FROM Pracownik DOŁĄCZ DO Działu ON Pracownik . Identyfikator działu = Dział . DepartmentID GROUP BY DepartmentName HAVING COUNT ( * ) > 1 ;
MIEĆ
jest wygodne, ale nie konieczne. Kod odpowiadający powyższemu przykładowi, ale bez użycia HAVING
, może wyglądać następująco:
SELECT * FROM ( SELECT Nazwa działu AS nazwa_działu , LICZBA ( * ) AS Liczba pracowników FROM Pracownik AS pracownik JOIN Dział AS dział ON pracownik . ID działu = dział . ID działu GRUPA WEDŁUG nazwy działu ) AS grp WHERE grp . liczba pracowników > 1 ;