В этом уроке мы научимся использовать 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
в одном запросе. В простом запросе группировка ограничена значениями одной таблицы, но соединение таблиц позволяет преодолеть это ограничение.
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.