Łączenie trzech lub większej liczby tabel
Łączenie złączeń w łańcuch oraz analizowanie pośrednich zbiorów wyników
Łączenie trzech lub większej liczby tabel to bezpłatna lekcja SQL Interview Prep na CoddyKit. To lekcja 4 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 Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Złączenia tworzą łańcuch, nie gałęzie
Rzeczywiste zadania rekrutacyjne rzadko kończą się na dwóch tabelach. Prawdopodobnie trzeba będzie połączyć trzy, cztery lub więcej tabel. Najważniejsza myśl, która porządkuje ten chaos: złączenie wielu tabel jest po prostu sekwencją złączeń dwóch tabel.
Baza danych najpierw łączy dwie pierwsze tabele w wynik pośredni, a następnie łączy ten wynik z trzecią tabelą i tak dalej. Jeśli można rozumować o jednym złączeniu, można też rozumować o całym ich łańcuchu.
Schemat trzech tabel
Rozszerzamy nasz przykład o trzecią tabelę. Mamy teraz klientów, ich zamówienia oraz produkty, do których odwołuje się każde zamówienie.
customers(id, name)orders(id, customer_id, product_id, amount)products(id, title)
Te tabele łączą dwie relacje: orders.customer_id = customers.id oraz orders.product_id = products.id.
customers(id, name)
orders(id, customer_id, product_id, amount)
products(id, title)Podstawowe zapytanie obejmujące trzy tabele
Należy układać złączenia jedno po drugim. Każde JOIN ... ON dodaje tabelę i określa, jak łączy się ona z tym, co było wcześniej.
Należy czytać zapytanie od góry do dołu: zacząć od orders, dołączyć pasującego klienta, a następnie pasujący produkt. Każdy wiersz zamówienia zostaje uzupełniony o nazwę i tytuł produktu.
SELECT c.name, p.title, o.amount
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id;Myślenie w kategoriach pośrednich zbiorów wyników
Model mentalny, który ułatwia złączenia wielu tabel: po każdym JOIN-ie należy wyobrazić sobie dotychczasowy pośredni wynik.
- Po złączeniu 1: kolumny orders + customer.
- Po złączeniu 2: ten wynik + kolumny product.
Kolejna klauzula ON może odwoływać się do dowolnej kolumny, która już znajduje się w zbiorze pośrednim, dlatego kolejność JOIN-ów wpływa na to, co można zapisać w poszczególnych klauzulach ON.
Każda klauzula ON widzi wcześniejsze tabele
Ważną konsekwencją jest to, że klauzula ON późniejszego złączenia może odwoływać się do dowolnej tabeli złączonej wcześniej, a nie tylko do właśnie dodawanej tabeli.
W tym przykładzie trzecie złączenie odwołuje się do o (orders), które było już dostępne w zakresie zapytania. Czwartą tabelę można byłoby również połączyć z c lub p, ponieważ obie są już częścią dotychczasowego wyniku.
SELECT c.name, p.title, w.region
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id
JOIN warehouses w ON w.id = o.warehouse_id; -- refers to oZaczynanie od tabeli centralnej
Praktyczna wskazówka na rozmowę kwalifikacyjną: należy rozpocząć klauzulę FROM od tabeli faktów / tabeli centralnej — zwykle tej znajdującej się w środku relacji — a następnie przechodzić na zewnątrz do tabel referencyjnych.
Orders znajduje się w środku, przechowując klucze obce do customers i products, dlatego rozpoczęcie od tej tabeli sprawia, że każda klauzula ON jest prosta i odwołuje się do tabel występujących wcześniej.
-- orders is central: it links to both sides
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_idEfekt fan-out kumuluje się w łańcuchu
Wszystkie poznane zasady dotyczące efektu fan-out nadal obowiązują, a efekt ten się kumulujе. Jeśli każde zamówienie ma wiele pozycji, a każda pozycja ma wiele wierszy dotyczących podatku, liczba wierszy mnoży się na każdym etapie.
Gdy agregat w zapytaniu z wieloma złączeniami wydaje się zbyt duży, należy podejrzewać fan-out wprowadzony przez jedno ze złączeń pośrednich i osobno sprawdzić poziom szczegółowości każdego złączenia.
-- rows = orders * items_per_order * tax_rows_per_item
SELECT o.id
FROM orders o
JOIN order_items i ON i.order_id = o.id
JOIN item_taxes t ON t.item_id = i.id;Mieszanie typów JOIN w jednym łańcuchu
W jednym zapytaniu można łączyć INNER i LEFT JOIN, ale kolejność ma znaczenie. Gdy LEFT JOIN wprowadzi wartości NULL, późniejszy INNER JOIN odwołujący się do tych kolumn może usunąć zachowane wiersze.
Jeśli klient nie ma zamówienia, LEFT JOIN zachowa go z wartością NULL w kolumnie product_id, a następujący po nim INNER JOIN z products usunie go ponownie. To błąd, który łatwo popełnić pod presją.
SELECT c.name, p.title
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
JOIN products p ON p.id = o.product_id;
-- the INNER products join can cancel the LEFT JOINZachowanie zewnętrznych JOIN-ów
Aby zachować aż do końca klientów bez zamówień, również kolejne złączenie należy wykonać jako LEFT. Wartości NULL bezpiecznie przejdą wtedy do końca.
Zasada praktyczna: gdy raz wybierze się złączenie zewnętrzne, należy pozostać przy nim dla każdej tabeli dołączanej do opcjonalnej gałęzi.
SELECT c.name, p.title
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
LEFT JOIN products p ON p.id = o.product_id;
-- customers with no orders are now kept (NULL title)Przy większej skali aliasy są niezbędne
Przy czterech lub pięciu tabelach kilka z nich może mieć takie same nazwy kolumn, na przykład id, name lub created_at. Krótkie, spójne aliasy eliminują niejednoznaczność i zachowują czytelność zapytania.
Należy wybierać aliasy sugerujące tabelę (c, o, p) i kwalifikować każdą kolumnę. Rekruterzy traktują sposób stosowania aliasów jako oznakę tego, jak pisze się produkcyjny SQL.
SELECT c.id AS customer_id,
o.id AS order_id,
p.id AS product_id,
p.title
FROM orders o
JOIN customers c ON c.id = o.customer_id
JOIN products p ON p.id = o.product_id;Tabele pomostowe dla relacji wiele-do-wielu
Gdy dwie encje pozostają w relacji wiele-do-wielu, między nimi znajduje się trzecia tabela pośrednicząca (pomostowa), a złączenie wykonuje się za jej pośrednictwem. Studenci i kursy łączą się za pośrednictwem tabeli enrollments.
Rozpoznanie, że trzeba przejść przez tabelę pomostową, samo w sobie jest częstym sygnałem podczas rozmowy kwalifikacyjnej.
SELECT s.name, c.title
FROM students s
JOIN enrollments e ON e.student_id = s.id
JOIN courses c ON c.id = e.course_id;Szybkie sprawdzenie
Przeanalizuj łańcuch z mieszanymi typami JOIN.
Podsumowanie: łączenie trzech lub większej liczby tabel
Na rozmowę kwalifikacyjną należy zapamiętać:
- Złączenie wielu tabel to łańcuch złączeń dwóch tabel; po każdym kroku należy analizować wynik pośredni.
- Późniejsza klauzula ON może odwoływać się do dowolnej wcześniejszej tabeli w łańcuchu.
- Należy zaczynać od tabeli centralnej i przechodzić do tabel referencyjnych.
- Efekt fan-out kumuluje się w kolejnych złączeniach; na każdym etapie należy sprawdzać poziom szczegółowości.
- INNER JOIN po LEFT JOIN może go anulować; aby zachować opcjonalne wiersze, należy pozostać przy złączeniach zewnętrznych.
- Relacje wiele-do-wielu łączy się za pośrednictwem tabeli pomostowej.
Często zadawane pytania
Czy lekcja „Łączenie trzech lub większej liczby tabel” jest bezpłatna?
Tak — pełny tekst „Łączenie trzech lub większej liczby tabel” 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 Interview Prep, przejdź na CoddyKit PRO. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Łączenie trzech lub większej liczby tabel”?
Łączenie złączeń w łańcuch oraz analizowanie pośrednich zbiorów wyników Ćwiczysz SQL Interview Prep 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 Interview Prep?
Nie wymagamy żadnego doświadczenia. SQL Interview Prep 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 4 z 4.
Ile czasu zajmuje lekcja „Łączenie trzech lub większej liczby tabel”?
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 Interview Prep?
Tak. Każda lekcja SQL Interview Prep 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
- Jak INNER JOIN dopasowuje wiersze
- ON a WHERE w złączeniach
- Rozrost złączenia i powielanie wierszy
- Łączenie trzech lub większej liczby tabel