0Pricing
SQL Academy · Урок

Сотрудники и руководители

Классический пример иерархии

«Сотрудники и руководители» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Что такое самосоединение
  2. Сотрудники и руководители
  3. Сравнение строк в одной таблице
  4. Ограничения самосоединений
← Назад к SQL Academy