Wróć do: Bazy danych
średni SQLJOINmatura rozszerzona z informatyki

INNER JOIN – łączenie tabel

Łączenie dwóch tabel po wspólnym kluczu – INNER JOIN zwraca tylko te wiersze, dla których dopasowanie istnieje w obu tabelach.

01

Opis

W poprawnie zaprojektowanej bazie dane są porozdzielane między tabele, żeby się nie powtarzały. Nazwisko ucznia zapisujemy raz, w tabeli uczniowie, a jego oceny trzymamy osobno w tabeli oceny – powiązane numerem ucznia zamiast powtarzanym nazwiskiem.

Ta oszczędność ma cenę: informacja potrzebna do odpowiedzi na jedno pytanie leży w dwóch miejscach. „Jakie oceny ma Kowalska" wymaga zajrzenia do obu tabel naraz. Od tego jest INNER JOIN.

Klucz łączenia. Tabele łączy się po kolumnie, która występuje w obu i przechowuje tę samą informację. W tabeli uczniowie numer ucznia to id, a w tabeli oceny ten sam numer zapisany jest w kolumnie uczen_id. Warunek ON u.id = o.uczen_id mówi bazie: „wiersz z pierwszej tabeli pasuje do wiersza z drugiej wtedy, gdy te wartości są równe".

Jak powstaje wynik. Baza bierze wiersz z pierwszej tabeli i szuka w drugiej wszystkich wierszy, które spełniają warunek złączenia. Każde znalezione dopasowanie tworzy jeden wiersz wyniku – sklejony z kolumn obu tabel. Potem to samo dla kolejnego wiersza pierwszej tabeli.

Stąd bierze się rzecz, która najczęściej zaskakuje: jeśli uczeń ma cztery oceny, w wyniku pojawi się cztery razy – za każdym razem z inną oceną, ale z tym samym nazwiskiem. Wynik złączenia bywa więc dłuższy niż każda z łączonych tabel z osobna i nie jest to błąd.

Słowo „INNER" jest tu istotne. Złączenie wewnętrzne zwraca wyłącznie pary, które się dopasowały. Uczeń bez ani jednej oceny w wyniku nie wystąpi. Ocena przypisana do nieistniejącego numeru ucznia – również nie. Jeśli zadanie wymaga pokazania także uczniów bez ocen, INNER JOIN jest złym narzędziem; do tego służą złączenia zewnętrzne (LEFT JOIN).

Aliasy tabel. Zapis FROM uczniowie AS u nadaje tabeli krótką nazwę zastępczą. Przy złączeniach to nie kosmetyka: gdy obie tabele mają kolumnę o tej samej nazwie, alias jest jedynym sposobem, żeby jednoznacznie wskazać, o którą chodzi (u.id kontra o.id).

Warunki filtrujące dopisuje się tak jak zwykle – klauzulą WHERE, która działa już na wyniku złączenia. Na złączonych tabelach można też liczyć wartości zbiorcze przez GROUP BY.

02

Zapytanie

-- Podstawowe złączenie po kluczu: id ucznia = uczen_id w ocenach
SELECT u.nazwisko, o.przedmiot, o.ocena
FROM uczniowie AS u
INNER JOIN oceny AS o ON u.id = o.uczen_id
Wynik zapytania
nazwiskoprzedmiotocena
Kowalskainformatyka5
Kowalskamatematyka4
Nowakinformatyka3
Wiśniewskiinformatyka6
Wiśniewskimatematyka5
-- Uczeń z dwiema ocenami pojawia się w wyniku dwa razy - to normalne
SELECT u.nazwisko, o.ocena
FROM uczniowie AS u
INNER JOIN oceny AS o ON u.id = o.uczen_id
WHERE o.przedmiot = 'informatyka' AND o.ocena >= 5
Wynik zapytania
nazwiskoocena
Kowalska5
Wiśniewski6

Na maturze

Pierwsze pytanie przy każdym zadaniu ze złączeniem brzmi: po czym łączę te tabele? Odpowiedź jest w opisie struktury bazy dołączonym do arkusza – szukaj kolumny, która w jednej tabeli jest kluczem głównym, a w drugiej występuje jako odwołanie do niego. Zapisanie warunku ON po złej parze kolumn daje wynik, który wygląda wiarygodnie, a jest bez sensu.

Drugi typowy błąd to pominięcie warunku ON. Baza zwróci wtedy każdy wiersz pierwszej tabeli sklejony z każdym wierszem drugiej – przy 5 uczniach i 5 ocenach da to 25 wierszy zamiast 5. Jeśli wynik jest podejrzanie długi, sprawdź to w pierwszej kolejności.

Trzecia rzecz: gdy kolumna o tej samej nazwie występuje w obu tabelach, zawsze poprzedzaj ją aliasem. Bez tego baza zgłosi, że nazwa jest niejednoznaczna, i zapytanie się nie wykona.

04

Najczęściej zadawane pytania

Czy trzeba pisać INNER, czy wystarczy JOIN?

Samo JOIN w większości baz oznacza dokładnie to samo co INNER JOIN – słowo INNER jest opcjonalne. Na maturze warto je jednak zapisać, bo wprost pokazuje, że wybrałeś złączenie wewnętrzne świadomie, a nie przypadkiem.

Dlaczego w wyniku jest mniej wierszy, niż spodziewałem się zobaczyć?

Bo INNER JOIN pomija wiersze bez dopasowania. Uczeń, który nie ma ani jednej oceny, po prostu zniknie z wyniku. To zachowanie zgodne z definicją – jeśli takie wiersze mają być widoczne, potrzebne jest złączenie zewnętrzne.

Czy można połączyć więcej niż dwie tabele?

Tak – kolejne INNER JOIN ... ON ... dopisuje się jeden po drugim, każdy ze swoim warunkiem złączenia. Baza łączy je po kolei: wynik pierwszego złączenia staje się wejściem dla drugiego.

Powiązane zagadnienia