Czym jest self join
Łącz tabelę z samą sobą za pomocą aliasów
Czym jest self join to bezpłatna lekcja SQL Academy na CoddyKit. To lekcja 1 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.
Łączenie tabeli z samą sobą
Self join to złączenie tabeli z samą sobą. Początkowo może się to wydawać nietypowe, ale jest to skuteczna technika używana wtedy, gdy wiersze jednej tabeli są powiązane z innymi wierszami tej samej tabeli.
Najczęstszym przykładem jest tabela employees, w której każdy wiersz pracownika zawiera także identyfikator jego menedżera — który również jest pracownikiem zapisanym w tej samej tabeli.
Tabela employees
Rozważmy tabelę employees, w której każdy wiersz zawiera kolumny id, name i manager_id wskazującą na inny wiersz tej samej tabeli.
Taka struktura jest nazywana relacją odwołującą się do samej siebie lub rekurencyjną. Należy uruchomić poniższe zapytanie, aby utworzyć i wypełnić tabelę.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', NULL),
(2, 'Bob', 1),
(3, 'Carol', 1),
(4, 'Dave', 2),
(5, 'Eve', 2),
(6, 'Frank', 3);Dlaczego zwykłe złączenia tutaj nie działają
Jeśli chcą Państwo wyświetlić każdego pracownika wraz z imieniem jego menedżera, obie informacje znajdują się w tej samej tabeli. Zwykłe złączenie łączy dwie różne tabele (lub przynajmniej dwa różne źródła).
Aby odczytać tę samą tabelę dwukrotnie — raz dla pracownika i raz dla menedżera — należy użyć self join w połączeniu z aliasami tabel.
Wprowadzenie aliasów
Aby wykonać self join, należy podać tę samą nazwę tabeli dwukrotnie w klauzuli FROM / JOIN i nadać każdemu wystąpieniu inny alias. Dzięki aliasom SQL traktuje je jak dwie osobne tabele logiczne.
Przyjętą konwencją jest używanie krótkich, opisowych aliasów, takich jak e dla employee i m dla manager.
-- Conceptual structure (not yet a full query)
-- FROM employees AS e
-- JOIN employees AS m ON e.manager_id = m.idPierwsze złączenie tabeli z samą sobą
Oto kompletne złączenie tabeli z samą sobą, które wyświetla każdego pracownika wraz z imieniem jego menedżera. Warunek ON łączy wartość manager_id pracownika z wartością id menedżera.
Alice nie ma menedżera, dlatego jest wykluczona przez INNER JOIN — po stronie menedżera nie ma odpowiadającego jej wiersza.
SELECT
e.name AS employee,
m.name AS manager
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id;Uwzględnianie wierszy bez menedżera
Podczas używania INNER JOIN wiersze, dla których nie znaleziono dopasowania, są pomijane. Alice ma wartość manager_id = NULL, więc znika z wyników.
Należy użyć LEFT JOIN, aby zachować wszystkich pracowników i wyświetlać po prostu NULL (lub etykietę), gdy pracownik nie ma menedżera.
SELECT
e.name AS employee,
COALESCE(m.name, 'No Manager') AS manager
FROM employees AS e
LEFT JOIN employees AS m
ON e.manager_id = m.id;Filtrowanie wyników złączenia tabeli z samą sobą
Do złączenia tabeli z samą sobą można dodać klauzulę WHERE, tak samo jak do każdego innego zapytania. Poniższy przykład pobiera tylko tych pracowników, których bezpośrednim menedżerem jest Alice (id = 1).
SELECT
e.name AS employee,
m.name AS manager
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id
WHERE m.name = 'Alice';Liczenie bezpośrednich podwładnych
Złączenia tabeli z samą sobą dobrze współpracują z funkcjami agregującymi. Poniższe zapytanie zlicza bezpośrednich podwładnych każdego menedżera, grupując wyniki według aliasu menedżera.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees AS e
INNER JOIN employees AS m
ON e.manager_id = m.id
GROUP BY m.name
ORDER BY direct_reports DESC;Złączenia tabeli z samą sobą dla danych niehierarchicznych
Złączenia tabeli z samą sobą nie są ograniczone do hierarchii. Za każdym razem, gdy wiersze tabeli są powiązane z innymi wierszami tej samej tabeli, takie złączenie może okazać się pomocne.
Przykładem jest wyszukanie wszystkich par pracowników, którzy mają tego samego menedżera — tabelę łączy się z samą sobą na podstawie zgodnych wartości manager_id, jednocześnie dbając o to, aby nie połączyć pracownika z nim samym.
SELECT
a.name AS employee_1,
b.name AS employee_2,
a.manager_id
FROM employees AS a
INNER JOIN employees AS b
ON a.manager_id = b.manager_id
AND a.id < b.id;Rola aliasu
Aliasy są niezbędne podczas złączenia tabeli z samą sobą — bez nich baza danych nie potrafi rozpoznać, do której kopii tabeli odnosi się dana kolumna, i zgłosi błąd niejednoznaczności.
Można używać dowolnych nazw aliasów. Najważniejsza zasada mówi, że każde odwołanie do kolumny musi być poprzedzone właściwym aliasem, aby SQL wiedział, na którą instancję tabeli ma spojrzeć.
-- This will fail: column 'name' is ambiguous
-- SELECT name FROM employees JOIN employees ON manager_id = id;
-- This works: aliases remove the ambiguity
SELECT e.name, m.name
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;Praktyczne zastosowania
Złączenia tabeli z samą sobą często pojawiają się w rzeczywistych bazach danych. Typowe zastosowania to:
- Struktury organizacyjne — pracownicy i ich menedżerowie
- Drzewa kategorii — kategorie nadrzędne i podrzędne
- Struktury materiałowe — komponenty złożone z innych komponentów
- Sieci społecznościowe — wyszukiwanie znajomych znajomych w jednej tabeli połączeń
Rozpoznanie w schemacie klucza obcego odwołującego się do tej samej tabeli jest pierwszą wskazówką, że może być potrzebne złączenie tabeli z samą sobą.
Szybkie sprawdzenie
Przed przejściem dalej proszę sprawdzić swoją wiedzę na temat złączeń tabeli z samą sobą.
Podsumowanie lekcji
W tej lekcji poznali Państwo pojęcie self join oraz sytuacje, w których należy go używać:
- Self join łączy tabelę z samą sobą, odwołując się do niej dwukrotnie za pomocą różnych aliasów
- Należy użyć
INNER JOIN, aby wykluczyć wiersze bez dopasowania (np. menedżerów najwyższego szczebla), alboLEFT JOIN, aby je zachować - Klauzul
WHERE,GROUP BYi funkcji agregujących należy używać dokładnie tak samo jak w przypadku każdego innego złączenia - Należy użyć
a.id < b.idw klauzuliON, aby uniknąć zduplikowanych par podczas porównywania wierszy tej samej tabeli - Self join jest podstawowym narzędziem do pracy z danymi hierarchicznymi, drzewami kategorii i dowolnymi relacjami odwołującymi się do samej siebie
W następnej części poznają Państwo hierarchie wielopoziomowe z użyciem rekurencyjnych CTE.
Często zadawane pytania
Czy lekcja „Czym jest self join” jest bezpłatna?
Tak — pełny tekst „Czym jest self join” 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 „Czym jest self join”?
Łącz tabelę z samą sobą za pomocą aliasów Ć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 1 z 4.
Ile czasu zajmuje lekcja „Czym jest self join”?
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