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
.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ