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_idzidw 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
- Czym jest self join
- Pracownicy i menedżerowie
- Porównywanie wierszy w tej samej tabeli
- Ograniczenia self joinów