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. Этап 1 – выборка строк
    • Сначала выбираются все строки из указанной таблицы.
    • Затем к ним добавляются вычисляемые поля.
    • А затем из всех строк остаются только те, которые удовлетворяют условию WHERE
  2. Этап 2 – группировка
    • После этого к полученным результатам применяется группировка.
    • Во время группировки вычисляются такие поля как COUNT(*).
    • И наконец к результату группировки применяется фильтр HAVING.
  3. Этап 3 – сортировка
    • Строки, полученные на предыдущих этапах, сортируются с помощью ORDER BY.

И наконец результат можно обрезать с помощью LIMIT и OFFSET.

undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0245
Напиши запрос, который из таблицы cars выберет название (name) и количество автомобилей с определенным названием. В выборку должны попасть только автомобили с количеством больше 1.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0246
Напиши запрос, который из таблицы cars выберет название (name) и количество автомобилей с определенным названием. В выборку должны попасть только автомобили с количеством меньше 3. Для количества используй алиас car_count и этот алиас используй для проверки условия.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0247
Напиши запрос, который из таблицы employee выберет департамент (department), позицию (position) и количество сотрудников в данном департаменте на данной позиции. В выборку должны попасть только данные с количеством равным 1. Для количества используй алиас total и этот алиас используй для проверки ус
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0248
Напиши запрос, который из таблицы employee выберет департамент (department), позицию (position) и количество сотрудников в данном департаменте на данной позиции. В выборку должны попасть только данные с количеством более 1 и менее 4. Для количества используй алиас total и этот алиас используй для пр
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0249
Напиши запрос, который из таблицы employee выберет департамент (department), позицию (position) и количество сотрудников в данном департаменте на позиции 'backend developer'. В выборку должны попасть только данные с количеством равным 1. Для количества используй алиас total и этот алиас испо
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0250
Напиши запрос, который из таблицы employee выберет один департамент (department), позицию (position) и количество сотрудников в данном департаменте на позиции 'frontend developer'. В выборку должны попасть только данные с количеством более 1. Для количества используй алиас total и этот алиас
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0251
Напиши запрос, который из таблицы employee выберет два департамента (department), позиции (position) и количество сотрудников в данных департаментах. В выборку должны попасть только данные с количеством равным 1 или с позицией 'manager'. Первую строку результата нужно пропустить. Для количес