Зарегистрируйтесь, чтобы продолжить обучение

INNER JOIN и GROUP BY SQL: Join

В этом уроке мы научимся использовать INNER JOIN вместе с GROUP BY. Запросы, в которых одновременно используются и соединение, и группировка, часто используются для составления сводных отчетов.

Используем INNER JOIN вместе с GROUP BY

Рассмотрим пример с сотрудниками и отделами, в которых они работают:

Таблица departments хранит информацию об отделах компании:

departments

department_id name
1 Development Department
2 Marketing Department
3 Finance Department
4 HR Department
5 Sales Department

Таблица employees хранит информацию о сотрудниках: имя, отдел и зарплата:

employees

employee_id department_id name salary
1 1 John Smith 50000.00
2 1 Peter Johnson 60000.00
3 2 Mary Brown 55000.00
4 2 Alex Miller 70000.00
5 3 Helen White 48000.00

View on DB Fiddle

Допустим, мы хотим построить отчет, в котором будет указано название отдела, количество сотрудников в нем и суммарная зарплата всех сотрудников отдела.

Такую задачу легко решить с помощью соединения и группировки:

SELECT
    dep.name AS department, -- название отдела
    -- количество сотрудников в отделе
    COUNT(emp.employee_id) AS employees_count,
    SUM(emp.salary) AS total_salary -- суммарная зарплата отдела
FROM departments AS dep
INNER JOIN employees AS emp
    ON
        -- связываем сотрудников с отделами
        dep.department_id = emp.department_id
GROUP BY dep.name -- группировка по отделам

View on DB Fiddle

Результат выполнения запроса:

department employees_count total_salary
Finance Department 1 48000.00
Marketing Department 2 125000.00
Development Department 2 110000.00

Логически СУБД выполняет запрос следующим образом:

  1. Выполняется соединение двух таблиц по условию: dep.department_id = emp.department_id.
  2. Полученные строки разделяются на группы с одинаковым названием отдела — dep.name.
  3. Для каждой группы рассчитываются количество сотрудников в группе — COUNT(emp.employee_id) и суммарная зарплата — SUM(emp.salary).

В курсе по основам SQL мы разбирали, что GROUP BY накладывает ограничения на столбцы, которые перечислены в секции SELECT:

  • Либо столбец находится внутри агрегатной функции, например, SUM(), COUNT(), MIN(), MAX() и так далее
  • Либо он используется для группировки, то есть указан в секции GROUP BY

Выводы

В этом уроке мы узнали, как пользоваться INNER JOIN и GROUP BY в одном запросе. В простом запросе группировка ограничена значениями одной таблицы, но соединение таблиц позволяет преодолеть это ограничение.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff