INNER JOIN to rodzaj złączenia w SQL, który łączy dwie (lub więcej) tabele i zwraca wyłącznie te wiersze, dla których znalazło się dopasowanie po obu stronach warunku złączenia. Jeśli wiersz z jednej tabeli nie ma pary w drugiej, wypada z wyniku bez śladu. To najczęściej używany typ JOIN-a i domyślnie to o nim myślisz, gdy piszesz po prostu JOIN bez przedrostka.
Jak to działa
Bazy danych są znormalizowane, czyli dane porozrzucane są po wielu tabelach, żeby ich nie duplikować. Masz tabelę users i osobną tabelę orders, w której każde zamówienie trzyma tylko user_id. INNER JOIN to mechanizm, który skleja te kawałki z powrotem: bierze warunek (najczęściej równość klucza obcego z kluczem głównym) i zestawia pasujące wiersze w jeden szerszy rekord.
Kluczowa intuicja: INNER JOIN to część wspólna dwóch zbiorów. Klient bez zamówień nie pojawi się w wyniku. Zamówienie wskazujące na nieistniejącego klienta też nie. Jeśli zależy Ci na zachowaniu wierszy z jednej strony nawet bez dopasowania, potrzebujesz LEFT (albo RIGHT) JOIN.
Przykład z praktyki
Załóżmy PostgreSQL i sklep. Chcesz listę zamówień razem z nazwą klienta:
SELECT u.name, o.id, o.total FROM users u INNER JOIN orders o ON o.user_id = u.id;
Dostaniesz tylko klientów, którzy faktycznie coś zamówili. Aliasy (u, o) nie są wymagane, ale przy kilku tabelach ratują czytelność. Warunek po ON to serce złączenia, możesz tam dać więcej niż jedno porównanie, np. ON o.user_id = u.id AND o.status = 'paid'.
Częste błędy i mity
- Zapomniany warunek ON — pominięcie
ON(lub błędny warunek typu zawsze prawda) daje CROSS JOIN, czyli iloczyn kartezjański. Dwie tabele po 1000 wierszy zrobią Ci milion. Baza nie krzyknie, po prostu zwróci górę śmieci. - „INNER JOIN gubi mi dane” — to nie bug, to definicja. Jeśli giną wiersze, których oczekiwałeś, prawdopodobnie chcesz LEFT JOIN albo masz NULL-e w kolumnie złączenia (NULL nie dopasowuje się do niczego, nawet do NULL).
- Mit „INNER JOIN jest wolniejszy niż WHERE” — składnia
FROM a, b WHERE a.id = b.iddaje ten sam plan zapytania co INNER JOIN. To kwestia czytelności, nie wydajności. Optymalizator i tak rozkłada to na to samo.
Pojęcia powiązane: LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN, klucz obcy (foreign key), klucz główny (primary key), normalizacja, warunek ON, iloczyn kartezjański.