В этом уроке мы научимся использовать 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 |
Логически СУБД выполняет запрос следующим образом:
- Выполняется соединение двух таблиц по условию:
dep.department_id = emp.department_id. - Полученные строки разделяются на группы с одинаковым названием отдела —
dep.name. - Для каждой группы рассчитываются количество сотрудников в группе —
COUNT(emp.employee_id)и суммарная зарплата —SUM(emp.salary).
В курсе по основам SQL мы разбирали, что GROUP BY накладывает ограничения на столбцы, которые перечислены в секции SELECT:
- Либо столбец находится внутри агрегатной функции, например,
SUM(),COUNT(),MIN(),MAX()и так далее - Либо он используется для группировки, то есть указан в секции
GROUP BY
Выводы
В этом уроке мы узнали, как пользоваться INNER JOIN и GROUP BY в одном запросе. В простом запросе группировка ограничена значениями одной таблицы, но соединение таблиц позволяет преодолеть это ограничение.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.