5.1 Оператор HAVING
У SQL є ще один корисний оператор, який застосовується разом з GROUP BY
, називається він HAVING
.
За своїм змістом він повністю аналогічний оператору WHERE
. Тільки WHERE
дозволяє встановити фільтр рядків до угруповання, а за допомогою HAVING
можна задати фільтр, який застосовується до записів вже після групування.
Загальний вигляд запиту при використанні групування та фільтрації результатів групування має вигляд:
SELECT колонки
FROM таблиця
WHERE умова
GROUP BY колонки
HAVING умова
HAVING
можна використовувати лише якщо у запиті є GROUP BY
.
Давай напишемо запит, де відобразимо кількість найнятих співробітників за роками.
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
І результат такого запиту:
hire_year | total |
---|---|
2012 | 1 |
2013 | 1 |
2014 | 1 |
2015 | 2 |
2018 | 1 |
А тепер виключимо з нього роки, коли найняли одного чи менше працівників. Приклад:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
І результат такого запиту:
hire_year | total |
---|---|
2015 | 2 |
5.3 Порядок виконання операторів
Щоб писати правильні та ефективні SQL-запити, потрібно розуміти, як вони виконуються SQL-сервером.
Порядок виконання дій суворо регламентований і залежить від твого бажання. Ти не можеш переставити оператори місцями та отримати інший порядок.
SQL-запит виконується у кілька етапів у такому порядку.
- Етап 1 – вибірка рядків
- Спочатку вибираються всі рядки із зазначеної таблиці.
- Потім до них додаються поля, що обчислюються.
- А потім із усіх рядків залишаються лише ті, які задовольняють умові
WHERE
- Етап 2 – угруповання
- Після цього до отриманих результатів застосовується угруповання.
- Під час угруповання обчислюються такі поля, як
COUNT(*)
. - І нарешті до результату угруповання застосовується фільтр
HAVING
. - Етап 3 – сортування
- Рядки, отримані на попередніх етапах, сортуються за допомогою
ORDER BY
.
І нарешті результат можна обрізати за допомогою LIMIT
та OFFSET
.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ