Сотрудники и руководители
Классический пример иерархии
«Сотрудники и руководители» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое самосоединение
Самосоединение — это соединение таблицы с самой собой. Это может показаться необычным, но такой приём чрезвычайно полезен, когда строки таблицы связаны с другими строками в той же таблице.
Классический пример — таблица сотрудников, где у каждого сотрудника может быть руководитель, причём этот руководитель тоже хранится как сотрудник в той же таблице.
Таблица сотрудников
Создадим простую таблицу employees. У каждого сотрудника есть id, name и manager_id, который указывает на другую строку в той же таблице.
Если manager_id равен NULL, у сотрудника нет руководителя — он находится на вершине иерархии (например, это CEO).
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
manager_id INT REFERENCES employees(id)
);Добавление примеров данных
Заполним таблицу небольшой иерархией компании. Алиса — CEO (у неё нет руководителя). Боб и Кэрол подчиняются Алисе. Дэйв и Ив подчиняются Бобу.
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);Запрос без соединения
Если просто выбрать все строки, мы увидим исходные числа manager_id, а не имена руководителей. Это затрудняет чтение и не приносит пользы конечным пользователям.
SELECT id, name, manager_id
FROM employees;Написание самосоединения
Чтобы показать имя руководителя рядом с каждым сотрудником, соединим таблицу employees с самой собой. Для каждой копии зададим отдельный псевдоним: e для сотрудника и m для руководителя.
Условие соединения связывает manager_id сотрудника с id руководителя.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Включение сотрудников без руководителя
Приведённый выше INNER JOIN скрывает Алису, поскольку её manager_id равен NULL — в правой части нет совпадающей строки. Чтобы включить всех (даже сотрудника верхнего уровня), используйте LEFT JOIN.
Алиса появится со значением NULL в столбце руководителя.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;Использование COALESCE для удобства чтения
Значение NULL в столбце руководителя может вызывать вопросы. С помощью COALESCE можно заменить NULL понятной меткой, например 'Нет руководителя', чтобы отчёты выглядели аккуратнее.
SELECT
e.name AS employee,
COALESCE(m.name, 'No Manager') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY manager, employee;Поиск непосредственных подчинённых
Можно изменить запрос, чтобы спросить: кто подчиняется определённому руководителю? Это называется поиском непосредственных подчинённых. Здесь мы находим всех сотрудников, которые напрямую подчиняются Алисе (идентификатор = 1).
SELECT e.name AS direct_report
FROM employees e
WHERE e.manager_id = 1;Подсчёт подчинённых для каждого руководителя
Сочетание самосоединения с GROUP BY и COUNT позволяет узнать количество непосредственных подчинённых у каждого руководителя. Это полезно для анализа рабочей нагрузки.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;Два уровня в глубину
Чтобы одновременно увидеть два уровня иерархии — сотрудника, его руководителя и руководителя этого руководителя, — можно соединить таблицу в третий раз. Каждое соединение добавляет ещё один уровень иерархии.
SELECT
e.name AS employee,
m.name AS manager,
gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;Ограничения самосоединений
Самосоединения хорошо подходят для фиксированных неглубоких иерархий (1–3 уровня). Если глубина неизвестна или не ограничена — например, в организационной структуре компании, которая может иметь 10 уровней, — вместо этого понадобятся рекурсивные CTE.
Для большинства практических запросов о сотрудниках и руководителях подход с самосоединением, рассмотренный на этом уроке, является правильным инструментом.
Быстрая проверка
Проверьте своё понимание самосоединений и иерархии сотрудников и руководителей.
Итоги урока
На этом уроке Вы узнали, как использовать самосоединение для моделирования и запроса классической иерархии сотрудников и руководителей, хранящейся в одной таблице.
Главные выводы:
- Самосоединение соединяет таблицу с самой собой с помощью двух разных псевдонимов.
- Условие соединения связывает
manager_idсidв той же таблице. - Используйте INNER JOIN, чтобы видеть только сотрудников с руководителем, и LEFT JOIN, чтобы включить всех.
- COALESCE может заменить значения NULL в столбце руководителя понятной меткой.
- Для иерархий неограниченной глубины рассмотрите рекурсивные CTE.
Часто задаваемые вопросы
Урок «Сотрудники и руководители» бесплатный?
Да — полный текст урока «Сотрудники и руководители» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Сотрудники и руководители»?
Классический пример иерархии Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Сотрудники и руководители»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое самосоединение
- Сотрудники и руководители
- Сравнение строк в одной таблице
- Ограничения самосоединений