JavaRush /Курсы /Модуль 4. Работа с БД /Продвинутая группировка

Продвинутая группировка

Модуль 4. Работа с БД
2 уровень , 4 лекция
Открыта

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.

1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
Больше одного
Больше одного
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
Меньше 3
Меньше 3
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
Один в поле воин
Один в поле воин
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
2 или 3
2 или 3
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
Один бекендер
Один бекендер
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
Одного фронтендера мало
Одного фронтендера мало
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
Или 1 или менеджер
Или 1 или менеджер
Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Равиль Хакимов Уровень 107
10 октября 2025
А что это за условие в последних задачах? "Напиши запрос, который из таблицы employee выберет ОДИН департамент (department), позицию (position) и количество сотрудников в данном департаменте на позиции 'frontend developer'. " один строку? один строка? один запись? один параметр?
Андрей Уровень 72
8 декабря 2025
LIMIT
Руслан Никитин Уровень 109
6 января 2025
Олег Уровень 106 Expert
17 сентября 2024
Щёлкнул
Дмитрий Уровень 37
24 февраля 2024
Хотелось бы по подробнее раскрыть тему с порядком выполнения операторов, тк по опыту знаю, что использование LIMIT уменьшает время исполнения запроса и что-то я сомневаюсь, что проблема в том, что вывод результата на экран долгий, скорее порядок выполнения другой
Андрей Уровень 109
12 июня 2024
Тут имеется ввиду алгоритмический порядок, т.е. как оно должно работать в теории, чтобы получить ожидаемый результат. На практике СУБД может менять местами операции ради оптимизации, лишь бы результат не отличался от ожидаемого.
Madina Baizhanova Уровень 29
23 августа 2023
Виктор Шефф Уровень 111 Expert
5 февраля 2023
HAVING работает всегда в связке с GROUP BY
Anonymous #3322801 Уровень 5 Expert
17 октября 2023
и отличает его от WHERE то, что HAVING может работать с агрегатными функциями, а WHERE нет
Sergey Drogunov Уровень 117 Expert
17 ноября 2022
LIMIT {limit value}, {offset value} в одну строчку.
Igor Уровень 108 Expert
3 ноября 2022
В начале LIMIT, а потом OFFSET :)
Александр Уровень 111 Expert
20 ноября 2022
Спасибо, по последней задаче сначала писал наоборот. Сперва лимит, а потом оффсет. И в условии также указано: В выборку должны попасть только данные с количеством равным 1 или с позицией 'manager'. Не обратил внимание на это. Сперва писал AND position LIKE '%manager%', в выборке были пустые строки. Указал OR и все заработало.
Lt_Den Уровень 34
16 февраля 2023
У меня просто лекции по SQL. Какие задачи? Где вы их нашли? Тоже хочу задачи решать для закрепления материала
Александр Уровень 111 Expert
16 февраля 2023
Задачи вроде идут по подписке Mentor, в обычном premium их нет.
hidden #3296401 Уровень 35
28 августа 2023
Это только по самой максимальной подписке доступно