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 лекция
Недоступна
task0245
Напиши запрос, который из таблицы cars выберет название (name) и количество автомобилей с определенным названием. В выборку должны попасть только автомобили с количеством больше 1.
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0246
Напиши запрос, который из таблицы cars выберет название (name) и количество автомобилей с определенным названием. В выборку должны попасть только автомобили с количеством меньше 3. Для количества используй алиас car_count и этот алиас используй для проверки условия.
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0247
Напиши запрос, который из таблицы employee выберет департамент (department), позицию (position) и количество сотрудников в данном департаменте на данной позиции. В выборку должны попасть только данные с количеством равным 1. Для количества используй алиас total и этот алиас используй для проверки ус
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0248
Напиши запрос, который из таблицы employee выберет департамент (department), позицию (position) и количество сотрудников в данном департаменте на данной позиции. В выборку должны попасть только данные с количеством более 1 и менее 4. Для количества используй алиас total и этот алиас используй для пр
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0249
Напиши запрос, который из таблицы employee выберет департамент (department), позицию (position) и количество сотрудников в данном департаменте на позиции 'backend developer'. В выборку должны попасть только данные с количеством равным 1. Для количества используй алиас total и этот алиас испо
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0250
Напиши запрос, который из таблицы employee выберет один департамент (department), позицию (position) и количество сотрудников в данном департаменте на позиции 'frontend developer'. В выборку должны попасть только данные с количеством более 1. Для количества используй алиас total и этот алиас
1
Задача
Модуль 4. Работа с БД, 2 уровень, 4 лекция
Недоступна
task0251
Напиши запрос, который из таблицы employee выберет два департамента (department), позиции (position) и количество сотрудников в данных департаментах. В выборку должны попасть только данные с количеством равным 1 или с позицией 'manager'. Первую строку результата нужно пропустить. Для количес
Комментарии (14)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Равиль Хакимов Уровень 80
10 октября 2025
А что это за условие в последних задачах? "Напиши запрос, который из таблицы employee выберет ОДИН департамент (department), позицию (position) и количество сотрудников в данном департаменте на позиции 'frontend developer'. " один строку? один строка? один запись? один параметр?
Руслан Никитин Уровень 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 Уровень 2 Expert
17 октября 2023
и отличает его от WHERE то, что HAVING может работать с агрегатными функциями, а WHERE нет
Sergey Drogunov Уровень 111 Expert
17 ноября 2022
LIMIT {limit value}, {offset value} в одну строчку.
Igor Уровень 1 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
Это только по самой максимальной подписке доступно