INNER JOIN w języku SQL jest bardzo często wykorzystywany. W relacyjnych bazach danych znormalizowane dane rozsiane są po wielu tabelach. Gdy potrzebujesz danych z różnych tabel musisz je połączyć. Robisz to przy pomocy klauzuli INNER JOIN.
Co to jest JOIN i jak jest wykonywany przez motor bazy danych?
JOIN zawsze łączy tylko dwa zbiory. Choć właściwszym byłoby stwierdzenie, że dołącza drugi zbiór do pierwszego. Prawy do lewego. W składni wskazujesz wg danych z których kolumn złączenie ma nastąpić.
Motor bazy danych wykonuje złączenie dla wszystkich zbiorów danych wskazanych w klauzuli FROM zapytania SQL. Gdy pominiesz fragment opisujący warunki łączenia, wybrane zostaną wszystkie dane ze wszystkich zbiorów. Czyli wykonany zostanie CROSS JOIN, którego efektem jest iloczyn kartezjański. Zazwyczaj nieprzydatny.
Kolejność tabel i złączeń w klauzulach FROM i WHERE nie ma znaczenia. Optymalizator łączy tabele biorąc pod uwagę statystyki, indeksy i warunki łączenia.
Składnia niejawna INNER JOIN
Zapewne wielokrotnie widujesz składnię podobną do tej:
SELECT … FROM tab1 t1, tab2 t2 WHERE t1.id=t2.id
Jest to najprostsze i najpopularniejsze złączenie wewnętrzne (INNER JOIN) nazywane z angielska equijoin lub equi-join. Po polsku równozłączenie.
Nazwa equijoin używana jest ze względu na znak równości wykorzystywany do określania warunków łączenia tabel.
Jest to także przedstawiciel niejawnego złączenia. Z angielskiego implicit join. W niektórych motorach baz danych (np. SQL Server) przestarzałe (deprecated). Niejawne ponieważ motor bazy danych 'domyśla’ się złączenia dwóch zbiorów z warunków umieszczonych w klauzuli WHERE.
Składnia jawna
Poniższe jest przykładem jawnego złączenia wewnętrznego:
SELECT … FROM tab1 t1 INNER JOIN tab2 t2 ON t1.id=t2.id
Prawda, że bardziej czytelne?
W ten sposób jasno rozgraniczono w której części zapytania dane są łączone, a w której filtrowane. W klauzuli FROM, dzięki słowom kluczowym JOIN i ON, dane są łączone. Zapytanie nie filtruje danych, więc klauzula WHERE nie występuje.
Filtrowanie danych
Można dane filtrować także w klauzuli FROM. Na przykład w taki sposób:
SELECT … FROM tab1 t1 INNER JOIN tab2 t2 ON t1.id=t2.id AND t1.data<date'2022-05-20'
Syntaktycznie polecenie jest zupełnie poprawne. Wg mnie filtrowanie w klauzuli FROM psuje ustalony porządek i zaciemnia. Niemniej, w niektórych przypadkach, ma to swoje zastosowania. Jest to temat na osobny artykuł. Jeśli Cię ciekawi to daj proszę znać w komentarzu.
Uproszczenie składni złączenia wewnętrznego
Policzono, że złączenia wewnętrzne są najpopularniejsze. Najczęściej wykorzystywane. Aby pójść użytkownikom baz danych na rękę słowo kluczowe INNER uczyniono domyślnym. Dzięki czemu takie zapytanie:
SELECT … FROM tab1 t1 JOIN tab2 t2 ON t1.id=t2.id
jest totalnie poprawne.
Zauważono także, że bardzo często kolumna, po której dokonywane są równozłączenia, w obu łączonych tabelach nazywa się tak samo. Aby zaoszczędzić kolejne kilka klików w klawiaturę możesz użyć składni jak ta:
SELECT … FROM tab1 t1 JOIN tab2 t2 USING(id)
O ile Twój motor bazy danych wspiera standard ANSI języka SQL w edycji SQL/92. Oczywiście kolumna id musi występować w obu łączonych tabelach.
Jest to kosmetyka składniowa nie mająca wpływu na wydajność.
Słowo kluczowe USING pozwala na łączenie zbiorów danych po więcej niż jednej kolumnie. Wtedy wygląda to tak:
SELECT … FROM tab1 t1 JOIN tab2 t2 USING(id, data)
Nie pozwala jednak na użycie aliasów kolumn.
NATURAL JOIN
Możesz pokusić się o dalsze uproszczenie zapisania JOIN. W przypadku gdy łączysz dane po jednej, identycznie nazywającej się, kolumnie. Czyli zastosować składnię NATURAL JOIN, która wygląda następująco:
SELECT … FROM tab1 t1 NATURAL JOIN tab2 t2
Przy założeniu, że tabele tab1 i tab2 dysponują identycznie nazywającą się kolumną – na przykład id – motor bazy danych dokona niejawnego złączenia używając danych z tych kolumn.
Drugim warunkiem wykorzystania NATURAL JOIN jest aby kolumny użyte w łączeniu były tego samego typu.
Używając powyższej składni nie dodawaj słowa kluczowego ON ani USING.
Ważną cechą odróżniającą NATURAL JOIN od INNER JOIN jest to, że kolumna po której następuje złączenie w wyniku pojawi się tylko raz.
NATURAL JOIN nie musi być wewnętrzny. Występuje także jako zewnętrzny. Ale to już temat na inny artykuł. Zostaw komentarz jeśli Cię to ciekawi.
Prowadzę szkolenia i kursy z podstaw SQL. Sprawdź ofertę moich kursów SQL.