Łączenie dwóch tabel po wspólnym kluczu – INNER JOIN zwraca tylko te wiersze, dla których dopasowanie istnieje w obu tabelach.
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.
-- 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
| nazwisko | przedmiot | ocena |
|---|---|---|
| Kowalska | informatyka | 5 |
| Kowalska | matematyka | 4 |
| Nowak | informatyka | 3 |
| Wiśniewski | informatyka | 6 |
| Wiśniewski | matematyka | 5 |
-- 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
| nazwisko | ocena |
|---|---|
| Kowalska | 5 |
| Wiśniewski | 6 |
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.
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.
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.
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.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: