Semantyka RIGHT i FULL OUTER JOIN
Kiedy potrzebne jest każde z nich i jak przepisać RIGHT jako LEFT
Semantyka RIGHT i FULL OUTER JOIN to bezpłatna lekcja Coding Interview Prep 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 Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co dalej po LEFT JOIN
Gdy LEFT JOIN jest już zrozumiałe, rekruterzy sprawdzają jego lustrzane odbicie oraz połączenie obu podejść: RIGHT JOIN i FULL OUTER JOIN.
- RIGHT JOIN zachowuje każdy wiersz prawej tabeli.
- FULL OUTER JOIN zachowuje niepasujące wiersze z obu tabel.
Ta lekcja precyzyjnie definiuje oba złączenia i pokazuje sztuczkę z przepisaniem zapytania, którą rekruterzy bardzo lubią: dowolny RIGHT JOIN można zamienić na LEFT JOIN.
Definicja RIGHT JOIN
RIGHT JOIN (lub RIGHT OUTER JOIN) zachowuje każdy wiersz z prawej tabeli, czyli tabeli zapisanej po słowie kluczowym JOIN. Niepasujące wiersze prawej tabeli pojawiają się z wartością NULL w kolumnach lewej tabeli.
To dokładne lustrzane odbicie LEFT JOIN. LEFT zachowuje tabelę wymienioną jako pierwszą, a RIGHT zachowuje tabelę wymienioną jako drugą.
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c
ON o.customer_id = c.id;
-- keeps ALL customers, even those
-- with no order (Carol -> amount NULL)Ponownie te same tabele
Te same dane co wcześniej. Carol (klient 3) nie ma żadnego zamówienia. Wszystkie wiersze zamówień odwołują się tutaj do istniejącego klienta, więc gdy zachowywaną stroną jest tabela customers, żadne zamówienie nie jest osierocone.
-- customers orders
-- 1 | Alice 10 | 1 | 50
-- 2 | Bob 11 | 1 | 75
-- 3 | Carol 12 | 2 | 20Zastępowanie RIGHT przez LEFT
Puenta rozmowy kwalifikacyjnej: RIGHT JOIN jest w praktyce rzadko używany, ponieważ zawsze można odwrócić kolejność tabel i użyć LEFT JOIN. Poniższe dwa zapytania są logicznie identyczne.
Wiele przewodników stylu całkowicie zabrania RIGHT JOIN, ponieważ czytanie od lewej do prawej i konsekwentne zachowywanie lewej tabeli ułatwia rozumowanie.
-- RIGHT JOIN
SELECT c.name, o.amount
FROM orders o
RIGHT JOIN customers c ON o.customer_id = c.id;
-- Equivalent LEFT JOIN (preferred)
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;Definicja FULL OUTER JOIN
FULL OUTER JOIN zachowuje niepasujące wiersze z obu tabel. Należy myśleć o nim jak o połączeniu LEFT JOIN i RIGHT JOIN:
- Dopasowane pary pojawiają się normalnie.
- Wiersze lewej tabeli bez dopasowania: kolumny prawej tabeli mają wartość NULL.
- Wiersze prawej tabeli bez dopasowania: kolumny lewej tabeli mają wartość NULL.
Odpowiada na potrzebę: „pokaż wszystko z obu stron, dopasowując pasujące wiersze”.
SELECT c.name, o.id AS order_id
FROM customers c
FULL OUTER JOIN orders o
ON o.customer_id = c.id;Kiedy FULL OUTER JOIN sprawdza się najlepiej
FULL OUTER JOIN jest podstawowym narzędziem do uzgadniania danych: porównywania dwóch zbiorów danych, które powinny być zgodne, ale mogą się różnić.
Wyobraźmy sobie tabelę orders oraz oddzielną tabelę payments. FULL OUTER JOIN po identyfikatorze zamówienia ujawnia w jednym wyniku zarówno zamówienia bez płatności, jak i płatności bez pasującego zamówienia — każdy taki przypadek jest oznaczony wartościami NULL po stronie brakującego dopasowania.
SELECT o.id AS order_id, p.id AS payment_id
FROM orders o
FULL OUTER JOIN payments p
ON p.order_id = o.id
WHERE o.id IS NULL OR p.id IS NULL;
-- rows where one side is missingŚwiadomość różnic między dialektami
Osoba prowadząca rozmowę może sprawdzić przenośność rozwiązania. MySQL nie ma słowa kluczowego FULL OUTER JOIN (do wersji 8 włącznie). PostgreSQL, SQL Server i Oracle je obsługują.
W MySQL można je emulować, łącząc LEFT JOIN i RIGHT JOIN za pomocą UNION (który usuwa zduplikowane dopasowane wiersze). Znajomość tej różnicy świadczy o praktycznym doświadczeniu.
-- FULL OUTER JOIN emulated in MySQL
SELECT c.name, o.id FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
UNION
SELECT c.name, o.id FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.id;Cztery typy złączeń w skrócie
Proszę zapamiętać tę tabelę. „Zachowane” oznacza, że niedopasowane wiersze pozostają w wyniku z wartościami NULL.
- INNER JOIN: tylko dopasowane wiersze. Nic nie jest zachowywane.
- LEFT JOIN: zachowywane są wszystkie wiersze z lewej strony.
- RIGHT JOIN: zachowywane są wszystkie wiersze z prawej strony.
- FULL OUTER JOIN: zachowywane są wiersze z obu stron.
Każde pytanie rekrutacyjne dotyczące złączeń zewnętrznych sprowadza się do wyboru strony lub stron, które należy zachować.
Wybór odpowiedniego złączenia
Proszę wybrać złączenie, zadając sobie pytanie: „Które niedopasowane wiersze muszę zachować?”
- Jeśli należy zachować tylko wiersze głównej tabeli: LEFT JOIN (główną tabelę należy umieścić jako pierwszą).
- Jeśli do uzgodnienia potrzebne są oba zbiory niedopasowanych wierszy: FULL OUTER JOIN.
- Jeśli istotne są tylko dopasowania: INNER JOIN.
Prawie nigdy nie wybiera się aktywnie RIGHT JOIN; zamiast tego przekształca się je w LEFT JOIN.
Przykład uzgadniania danych
Proszę wykorzystać FULL OUTER JOIN do oznaczenia statusu każdego wiersza. Wyrażenie CASE analizujące układ wartości NULL informuje, której strony brakuje — jest to klasyczne zapytanie audytowe.
SELECT
COALESCE(o.id, p.order_id) AS ord,
CASE
WHEN p.id IS NULL THEN 'no payment'
WHEN o.id IS NULL THEN 'orphan payment'
ELSE 'matched'
END AS status
FROM orders o
FULL OUTER JOIN payments p ON p.order_id = o.id;Częste nieporozumienie
Kandydaci często sądzą, że FULL OUTER JOIN zwraca iloczyn kartezjański niedopasowanych wierszy. Tak nie jest. Niedopasowane wiersze z każdej strony pojawiają się dokładnie raz, połączone z wartościami NULL, i nigdy nie są wzajemnie mnożone.
Dopasowane wiersze nadal podlegają zwykłemu mnożeniu złączenia (jeden wiersz wynikowy na każdą pasującą parę) — obowiązuje tu ta sama zasada rozgałęziania co w przypadku dowolnego złączenia.
Szybkie sprawdzenie
Osoba prowadząca rozmowę prosi o przepisanie zapytania dla zespołu, który zabrania używania RIGHT JOIN.
Podsumowanie
RIGHT JOIN zachowuje prawą tabelę, a FULL OUTER JOIN zachowuje obie. Każde RIGHT JOIN można przepisać jako LEFT JOIN, zamieniając kolejność tabel, dlatego zespoły preferują LEFT JOIN.
FULL OUTER JOINdoskonale nadaje się do uzgadniania dwóch zbiorów danych.- MySQL nie obsługuje
FULL OUTER JOIN; można je emulować za pomocąLEFT JOIN+RIGHT JOIN+UNION. - Złączenie należy wybrać, decydując, które niedopasowane wiersze mają zostać zachowane.
- Niedopasowane wiersze pojawiają się raz z wartościami NULL, nigdy jako iloczyn kartezjański.
Często zadawane pytania
Czy lekcja „Semantyka RIGHT i FULL OUTER JOIN” jest bezpłatna?
Tak — pełny tekst „Semantyka RIGHT i FULL OUTER 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 Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „Semantyka RIGHT i FULL OUTER JOIN”?
Kiedy potrzebne jest każde z nich i jak przepisać RIGHT jako LEFT Ćwiczysz Coding 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ąć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding 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 2 z 4.
Ile czasu zajmuje lekcja „Semantyka RIGHT i FULL OUTER 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 Coding Interview Prep?
Tak. Każda lekcja Coding 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
- LEFT JOIN i zachowywanie niedopasowanych wierszy
- Semantyka RIGHT i FULL OUTER JOIN
- Znajdowanie wierszy bez dopasowania (anti-join)
- Pułapka WHERE w złączeniu zewnętrznym