0Pricing
SQL Academy · Lekcja

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.id

Pierwsze 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), albo LEFT JOIN, aby je zachować
  • Klauzul WHERE, GROUP BY i 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.id w klauzuli ON, 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

  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