5.1 Oświadczenie HAVING
Jest jeszcze jeden użyteczny operator w SQL, który jest używany z GROUP BY
, nazywa się HAVING
.
W swoim znaczeniu jest całkowicie analogiczny do operatora WHERE
. Pozwala tylko WHERE
ustawić filtr wierszy przed grupowaniem, a przy pomocy HAVING
można ustawić filtr, który jest stosowany do rekordów po grupowaniu.
Ogólny widok zapytania podczas korzystania z grupowania i filtrowania wyników grupowania jest następujący:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
można użyć tylko wtedy, gdy żądanie zawiera GROUP BY
.
Napiszmy zapytanie, w którym wyświetlimy liczbę zatrudnionych pracowników według roku.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
I wynik tego zapytania:
rok_wynajmu | całkowity |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
A teraz wyłączamy z tego lata, w których zatrudniono jednego lub mniej pracowników. Przykład:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
I wynik tego zapytania:
rok_wynajmu | całkowity |
---|---|
2015 | 2 |
5.3 Kolejność wykonywania oświadczeń
Aby pisać poprawne i wydajne zapytania SQL, musisz zrozumieć, w jaki sposób są one wykonywane przez serwer SQL.
Procedura wykonywania czynności jest ściśle regulowana i nie zależy od twojego pragnienia. Nie możesz zmienić kolejności operatorów i uzyskać innej kolejności.
Zapytanie SQL jest wykonywane w kilku etapach w tej kolejności.
- Etap 1 - pobieranie wierszy
- Najpierw wybierane są wszystkie wiersze z określonej tabeli.
- Następnie dodawane są do nich pola obliczeniowe.
- A potem ze wszystkich rzędów pozostają tylko te, które spełniają warunek
WHERE
- Etap 2 - grupowanie
- Następnie do wyników stosuje się grupowanie.
- Podczas grupowania pola takie jak
COUNT(*)
. - Na koniec do wyniku grupowania stosowany jest filtr
HAVING
. - Etap 3 - sortowanie
- Wiersze uzyskane w poprzednich krokach są sortowane przy użyciu
ORDER BY
.
Na koniec wynik można przyciąć za pomocą LIMIT
i OFFSET
.
GO TO FULL VERSION