0Pricing
SQL Interview Prep · Lekcja

Jak INNER JOIN dopasowuje wiersze

Model mentalny parowania wierszy, który ułatwia każde pytanie o złączenia

Jak INNER JOIN dopasowuje wiersze to bezpłatna lekcja SQL Interview Prep 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 Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL Interview Prep zawiera 4 lekcji w sumie.

Pierwszy JOIN, o który pytają rekruterzy

Gdy rozmówca mówi „połącz te dwie tabele”, niemal zawsze ma na myśli INNER JOIN. Jest to domyślny typ złączenia i ten, który pokazuje, czy rzeczywiście rozumieją Państwo, jak parowane są wiersze.

Cały temat można sprowadzić do jednego zdania: INNER JOIN rozważa każdą możliwą parę wierszy z dwóch tabel i zachowuje wyłącznie pary spełniające warunek ON. Brak dopasowania oznacza, że wiersz po prostu znika z wyniku.

Proszę utrwalić ten model myślowy, a każde trudniejsze pytanie dotyczące złączeń stanie się łatwiejsze.

Dwie tabele do analizy

W całej lekcji korzystamy z dwóch małych tabel. customers zawiera informacje o klientach, którzy złożyli zamówienia, a orders rejestruje każde zamówienie wraz z klientem, do którego ono należy.

  • customers(id, name)
  • orders(id, customer_id, amount)

Łączy je zależność orders.customer_id = customers.id. Ta równość jest predykatem złączenia, od którego zależy cały wynik.

customers
id | name
1  | Ada
2  | Bob
3  | Cleo   -- no orders yet

orders
id | customer_id | amount
10 | 1           | 50
11 | 1           | 20
12 | 2           | 99

Podstawowe zapytanie INNER JOIN

Oto kanoniczne zapytanie, które rozmówca rekrutacyjny chce zobaczyć. Widać w nim trzy elementy: dwie tabele, konstrukcję JOIN ... ON parującą wiersze oraz wybierane kolumny.

Słowo kluczowe INNER jest opcjonalne w każdej głównej bazie danych. Zwykłe JOIN oznacza INNER JOIN, ale zapisanie tego jawnie sygnalizuje intencję i eliminuje niejednoznaczność podczas przeglądu kodu.

SELECT c.name, o.amount
FROM customers AS c
INNER JOIN orders AS o
  ON o.customer_id = c.id;

Jak wygląda wynik

Po wykonaniu zapytania na przykładowych danych otrzymują Państwo trzy wiersze. Ada ma dwa zamówienia, więc pojawia się dwa razy. Bob pojawia się raz.

Cleo znika. Nie ma żadnego pasującego zamówienia, dlatego INNER JOIN całkowicie usuwa ją z wyniku. W rozmowie dotyczącej złączeń najważniejsze jest wyraźne powiedzenie, że niedopasowane wiersze znikają.

name | amount
Ada  | 50
Ada  | 20
Bob  | 99

Model parowania wierszy

Proszę wyobrazić sobie, że baza danych najpierw tworzy iloczyn kartezjański: każdego klienta łączy z każdym zamówieniem. Przy 3 klientach i 3 zamówieniach daje to 9 par kandydatów.

Następnie stosuje predykat ON i zachowuje tylko te pary, dla których jest on prawdziwy. Spośród 9 kandydatów warunek o.customer_id = c.id spełniają tylko 3.

Nie należy myśleć o tym w ten sposób w kontekście wydajności, ale jest to dokładny model pozwalający odpowiedzieć na każde pytanie „ile wierszy zostanie zwróconych?”.

Analiza par kandydatów

Prześledźmy to. Komentarz po każdej parze pokazuje, czy predykat jest prawdziwy.

Tylko trzy wiersze TRUE pozostają w wyniku. Każda para zawierająca Cleo (id 3) nie spełnia warunku, więc nie wnosi ona nic do wyniku.

-- customer.id vs order.customer_id
(Ada=1, ord10 cust=1)  -> TRUE  keep
(Ada=1, ord11 cust=1)  -> TRUE  keep
(Ada=1, ord12 cust=2)  -> FALSE
(Bob=2, ord10 cust=1)  -> FALSE
(Bob=2, ord12 cust=2)  -> TRUE  keep
(Cleo=3, anything)     -> FALSE (no order matches 3)

INNER JOIN nie zależy od kolejności

Częste pytanie sprawdzające: czy ma znaczenie, którą tabelę umieści się jako pierwszą? W przypadku INNER JOIN nie. Te dwa zapytania zwracają identyczne wiersze, ponieważ warunek ON jest symetryczny.

Optymalizator może odczytać najpierw dowolną tabelę, niezależnie od sposobu zapisania zapytania. (Nie dotyczy to złączeń LEFT/RIGHT, które omówimy później).

-- These return the same rows
SELECT c.name, o.amount
FROM customers c JOIN orders o ON o.customer_id = c.id;

SELECT c.name, o.amount
FROM orders o JOIN customers c ON c.id = o.customer_id;

Aliasy tabel są standardem

Rekruterzy oczekują krótkich, czytelnych aliasów. Proszę porównać rozwlekłą, w pełni kwalifikowaną wersję z przejrzystą wersją z aliasami.

Aliasów należy użyć także obowiązkowo, gdy nazwa kolumny występuje w obu tabelach. Wybranie samego id spowodowałoby błąd niejednoznacznej kolumny, dlatego należy zapisać c.id lub o.id.

-- verbose
SELECT customers.name, orders.amount
FROM customers JOIN orders
  ON orders.customer_id = customers.id;

-- aliased, preferred
SELECT c.name, o.amount
FROM customers c JOIN orders o
  ON o.customer_id = c.id;

Łączenie po więcej niż jednej kolumnie

Predykat ON nie jest ograniczony do pojedynczego porównania równościowego. Gdy relację definiuje klucz złożony, warunki łączy się operatorem AND.

W tym przypadku cena obowiązuje dla produktu w danym regionie, więc obie kolumny muszą się zgadzać. Rekruterzy wykorzystują ten przykład, aby sprawdzić, czy kandydat nie zapamiętał wyłącznie złączeń po jednej kolumnie.

SELECT s.units, p.unit_price
FROM sales s
INNER JOIN price_list p
  ON p.product_id = s.product_id
 AND p.region     = s.region;

Istnieją również złączenia nierównościowe

Warunek ON może być dowolnym wyrażeniem logicznym, nie tylko =. Złączenie nierównościowe wykorzystuje zakresy lub nierówności. Klasyczny przykład przypisuje wynik do przedziału ocen.

Każdy wynik pasuje do tego jednego przedziału, który go obejmuje. Zaznaczenie, że złączenia nie ograniczają się do równości, to szybki sposób na zaprezentowanie bardziej zaawansowanej wiedzy.

SELECT s.student, g.grade
FROM scores s
INNER JOIN grades g
  ON s.points >= g.min_points
 AND s.points <= g.max_points;

Jawny JOIN a złączenie przecinkowe

W starszym kodzie i niektórych pytaniach rekrutacyjnych nadal można spotkać starą składnię złączenia przecinkowego. W przypadku INNER JOIN te dwa zapytania są równoważne.

Należy preferować jawną formę JOIN ... ON. Składnię przecinkową łatwo omyłkowo przekształcić w iloczyn kartezjański przez pominięcie WHERE — dokładnie taki błąd rekruterzy próbują wychwycić.

-- old implicit join
SELECT c.name, o.amount
FROM customers c, orders o
WHERE o.customer_id = c.id;

-- modern explicit join (preferred)
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id;

Szybki test

Sprawdź podstawową zasadę dopasowywania w INNER JOIN.

Podsumowanie: jak INNER JOIN dopasowuje wiersze

Najważniejsze punkty, które warto powtórzyć podczas rozmowy:

  • INNER JOIN zachowuje wyłącznie dopasowane pary; niedopasowane wiersze po obu stronach znikają.
  • Model mentalny: utwórz wszystkie pary kandydatów, a następnie zachowaj te, dla których predykat ON ma wartość true.
  • Jest niezależny od kolejności, a słowo kluczowe INNER jest opcjonalne.
  • ON może używać kluczy złożonych, zakresów i nierówności, a nie tylko pojedynczego =.
  • Używaj jawnej formy JOIN ... ON z czytelnymi aliasami, aby unikać błędów związanych z niejednoznacznymi kolumnami i przypadkowymi iloczynami kartezjańskimi.

Często zadawane pytania

Czy lekcja „Jak INNER JOIN dopasowuje wiersze” jest bezpłatna?

Tak — pełny tekst „Jak INNER JOIN dopasowuje wiersze” 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 „Jak INNER JOIN dopasowuje wiersze”?

Model mentalny parowania wierszy, który ułatwia każde pytanie o złączenia Ć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 1 z 4.

Ile czasu zajmuje lekcja „Jak INNER JOIN dopasowuje wiersze”?

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

  1. Jak INNER JOIN dopasowuje wiersze
  2. ON a WHERE w złączeniach
  3. Rozrost złączenia i powielanie wierszy
  4. Łączenie trzech lub większej liczby tabel
← Powrót do SQL Interview Prep