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 WHEREustawić filtr wierszy przed grupowaniem, a przy pomocy HAVINGmoż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

HAVINGmoż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.

  1. 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ą warunekWHERE
  2. 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.
  3. Etap 3 - sortowanie
    • Wiersze uzyskane w poprzednich krokach są sortowane przy użyciu ORDER BY.

Na koniec wynik można przyciąć za pomocą LIMITi OFFSET.