0Pricing
SQL Academy · Lekcja

Pracownicy i menedżerowie

Klasyczny przykład hierarchii

Pracownicy i menedżerowie to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej SQL Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Academy zawiera 4 lekcji w sumie.

Czym jest self join

Self join to złączenie tabeli z samą sobą. Może się to wydawać nietypowe, ale jest niezwykle przydatne, gdy wiersze tabeli są powiązane z innymi wierszami tej samej tabeli.

Klasycznym przykładem jest tabela employees, w której każdy pracownik może mieć menedżera — a ten menedżer również jest pracownikiem zapisanym w tej samej tabeli.

Tabela employees

Utwórzmy prostą tabelę employees. Każdy pracownik ma kolumny id, name i manager_id, która wskazuje inny wiersz tej samej tabeli.

Gdy manager_id ma wartość NULL, pracownik nie ma menedżera — znajduje się na szczycie hierarchii (np. jest dyrektorem generalnym).

CREATE TABLE employees (
  id         INT PRIMARY KEY,
  name       VARCHAR(100) NOT NULL,
  manager_id INT REFERENCES employees(id)
);

Wstawianie przykładowych danych

Wypełnijmy tabelę hierarchią małej firmy. Alice jest dyrektorką generalną (nie ma menedżera). Bob i Carol podlegają Alice. Dave i Eve podlegają Bobowi.

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);

Wykonywanie zapytania bez złączenia

Jeśli po prostu wybierzemy wszystkie wiersze, zobaczymy surowe numery manager_id — a nie imiona menedżerów. Jest to trudne do odczytania i mało przydatne dla użytkowników końcowych.

SELECT id, name, manager_id
FROM employees;

Tworzenie złączenia tabeli z samą sobą

Aby wyświetlić imię menedżera obok każdego pracownika, łączymy tabelę employees z samą sobą. Każdej kopii nadajemy inny alias: e dla pracownika i m dla menedżera.

Warunek złączenia łączy wartość manager_id pracownika z wartością id menedżera.

SELECT
  e.name   AS employee,
  m.name   AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Uwzględnianie pracowników bez menedżera

Powyższe INNER JOIN ukrywa Alice, ponieważ jej manager_id ma wartość NULL — po prawej stronie nie ma odpowiadającego wiersza. Aby uwzględnić wszystkich (również pracownika najwyższego szczebla), należy użyć LEFT JOIN.

Alice pojawi się z wartością NULL w kolumnie menedżera.

SELECT
  e.name              AS employee,
  m.name              AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

Używanie COALESCE dla lepszej czytelności

Wartość NULL w kolumnie menedżera może być myląca. Można użyć COALESCE, aby zastąpić NULL czytelną etykietą, taką jak 'Brak menedżera', dzięki czemu wyniki raportów będą bardziej przejrzyste.

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;

Wyszukiwanie bezpośrednich podwładnych

Możemy odwrócić zapytanie i zapytać: kto podlega konkretnemu menedżerowi? Nazywa się to wyszukiwaniem bezpośrednich podwładnych. W tym przykładzie wyszukujemy wszystkich pracowników podlegających bezpośrednio Alice (id = 1).

SELECT e.name AS direct_report
FROM employees e
WHERE e.manager_id = 1;

Zliczanie podwładnych każdego menedżera

Połączenie złączenia tabeli z samą sobą z GROUP BY i COUNT pozwala sprawdzić, ilu bezpośrednich podwładnych ma każdy menedżer. Jest to przydatne podczas analizy obciążenia pracą.

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;

Dwa poziomy w głąb

Aby jednocześnie wyświetlić dwa poziomy hierarchii — pracownika, jego menedżera i menedżera tego menedżera — możemy połączyć tabelę po raz trzeci. Każde kolejne złączenie dodaje następny poziom hierarchii.

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;

Ograniczenia złączeń tabeli z samą sobą

Złączenia tabeli z samą sobą dobrze sprawdzają się w przypadku stałych, płytkich hierarchii (1–3 poziomy). Jeśli głębokość jest nieznana lub nieograniczona — na przykład schemat organizacyjny firmy może mieć 10 poziomów — należy użyć rekurencyjnych CTE.

W przypadku większości praktycznych zapytań dotyczących pracowników i menedżerów podejście z użyciem złączenia tabeli z samą sobą, omówione w tej lekcji, jest właściwym narzędziem.

Szybkie sprawdzenie

Proszę sprawdzić swoją wiedzę na temat złączeń tabeli z samą sobą oraz hierarchii pracowników i menedżerów.

Podsumowanie lekcji

W tej lekcji poznali Państwo sposób używania self join do modelowania i odpytywania klasycznej hierarchii pracowników i menedżerów przechowywanej w jednej tabeli.

Najważniejsze informacje:

  • Self join łączy tabelę z samą sobą za pomocą dwóch różnych aliasów.
  • Warunek złączenia łączy manager_id z id w tej samej tabeli.
  • Należy użyć INNER JOIN, aby wyświetlić tylko pracowników mających menedżera, oraz LEFT JOIN, aby uwzględnić wszystkich.
  • COALESCE może zastąpić wartości NULL dotyczące menedżera czytelną etykietą.
  • W przypadku hierarchii o nieograniczonej głębokości warto rozważyć rekurencyjne CTE.

Często zadawane pytania

Czy lekcja „Pracownicy i menedżerowie” jest bezpłatna?

Tak — pełny tekst „Pracownicy i menedżerowie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu SQL Academy, przejdź na CoddyKit PRO. Kurs SQL Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Pracownicy i menedżerowie”?

Klasyczny przykład hierarchii Ćwiczysz SQL Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć SQL Academy?

Nie wymagamy żadnego doświadczenia. SQL Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Pracownicy i menedżerowie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji SQL Academy?

Tak. Każda lekcja SQL Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Czym jest self join
  2. Pracownicy i menedżerowie
  3. Porównywanie wierszy w tej samej tabeli
  4. Ograniczenia self joinów
← Powrót do SQL Academy