SQL: Join

Теория: INNER JOIN и GROUP BY

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

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

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

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

departments

department_idname
1Development Department
2Marketing Department
3Finance Department
4HR Department
5Sales Department

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

employees

employee_iddepartment_idnamesalary
11John Smith50000.00
21Peter Johnson60000.00
32Mary Brown55000.00
42Alex Miller70000.00
53Helen White48000.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

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

departmentemployees_counttotal_salary
Finance Department148000.00
Marketing Department2125000.00
Development Department2110000.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 в одном запросе. В простом запросе группировка ограничена значениями одной таблицы, но соединение таблиц позволяет преодолеть это ограничение.

Рекомендуемые программы