średniSQLSQL

SQL JOIN - Łączenie Tabel na Maturze z Informatyki

15 min czytania
SQL
Zaktualizowano: 3.11.2025

Jeśli SELECT to 'mózg' SQL, to JOIN jest jego 'sercem'. Rzadko kiedy wszystkie interesujące dane trzymane są w jednej, wielkiej tabeli. Prawdziwa siła baz danych leży w *relacjach*, czyli łączeniu informacji. Wyobraź sobie, że masz jedną tabelę 'Uczniowie' (z ich imionami i id_klasy) i drugą 'Klasy' (z id_klasy i nazwiskiem wychowawcy). Jak znaleźć wychowawcę dla danego ucznia? Właśnie za pomocą JOIN. Jest to komenda, która pozwala 'skleić' dwie tabele w jedną tymczasową, na podstawie wspólnej kolumny (tzw. klucza). Jest to absolutnie *niezbędne* do rozwiązania zadań maturalnych, które *zawsze* bazują na relacyjnej bazie danych (kilku połączonych tabelach).

Dlaczego to ważne? Na maturze *nigdy* nie dostaniesz bazy danych w jednej płaskiej tabeli. Zawsze będą to co najmniej 2-3 tabele (np. Kierowcy, Samochody, Wykroczenia). Zadania będą brzmiały: 'Znajdź imię kierowcy, który popełnił wykroczenie X'. Imię jest w jednej tabeli, wykroczenie w innej. JOIN to jedyny sposób, by odpowiedzieć na to pytanie za pomocą SQL. To jest 100% pewniak na egzaminie.

Teoria

JOIN łączy wiersze z dwóch lub więcej tabel na podstawie *wspólnej kolumny* (tzw. klucza obcego i głównego). Wynikiem jest nowa, tymczasowa tabela zawierająca kolumny z obu połączonych tabel. Najważniejsze typy JOIN to `INNER JOIN` i `LEFT JOIN`.

Jak to działa?

  1. `FROM TabelaA` - Określa 'lewą' tabelę (naszą główną).
  2. `JOIN TabelaB` - Określa 'prawą' tabelę, którą dołączamy.
  3. `ON TabelaA.klucz = TabelaB.klucz` - To jest *warunek łączenia*, serce operacji. Mówi SQL, jak dopasować wiersze (np. `ON Uczniowie.id_klasy = Klasy.id_klasy`).
  4. `INNER JOIN` (lub samo `JOIN`): Zwraca tylko te wiersze, które mają pasujący odpowiednik w *obu* tabelach. Jeśli uczeń nie ma klasy, a klasa nie ma uczniów, nie pojawią się w wyniku.
  5. `LEFT JOIN`: Zwraca *wszystkie* wiersze z lewej tabeli (`TabelaA`) i tylko pasujące wiersze z prawej (`TabelaB`). Jeśli uczeń z `TabelaA` nie ma odpowiednika w `TabelaB`, jego kolumny z `TabelaB` będą puste (`NULL`). Kluczowe do zadań typu 'znajdź wszystkich, nawet tych bez...'.
  6. Aliasy: Aby skrócić zapis, używamy aliasów: `FROM Uczniowie AS U JOIN Klasy AS K ON U.id_klasy = K.id_klasy`.

Złożoność: Nie dotyczy w sensie O(n). Wydajność zależy od tego, czy kolumny-klucze są zaindeksowane. Na maturze, przy małych bazach, każde poprawnie napisane zapytanie JOIN będzie natychmiastowe.

Implementacja

INNER JOIN (lub po prostu JOIN) - Znajdowanie dopasowań

SQL
-- Załóżmy, że mamy tabele:
-- Uczniowie (id_ucznia, imie, id_klasy)
-- Klasy (id_klasy, nazwa_klasy)

SELECT Uczniowie.imie, Klasy.nazwa_klasy
FROM Uczniowie
JOIN Klasy ON Uczniowie.id_klasy = Klasy.id_klasy;

To zapytanie pobiera imię ucznia i nazwę jego klasy. Łączy tabele tam, gdzie `id_klasy` jest takie samo w obu. Uczniowie bez przypisanej klasy (np. z `id_klasy = NULL`) nie pojawią się w wynikach.

Użycie aliasów (AS) - Dobra praktyka

SQL
SELECT U.imie, K.nazwa_klasy
FROM Uczniowie AS U
JOIN Klasy AS K ON U.id_klasy = K.id_klasy;

To zapytanie robi DOKŁADNIE to samo co poprzednie, ale jest znacznie krótsze i czytelniejsze. `Uczniowie AS U` oznacza, że w reszcie zapytania będziemy się odwoływać do tabeli `Uczniowie` używając skrótu `U`.

LEFT JOIN - Znajdowanie wszystkich + ewentualne braki

SQL
SELECT U.imie, K.nazwa_klasy
FROM Uczniowie AS U
LEFT JOIN Klasy AS K ON U.id_klasy = K.id_klasy;

Bardzo ważne! To zapytanie pokaże *wszystkich* uczniów, niezależnie od tego, czy mają klasę. Jeśli uczeń 'Adam' ma `id_klasy` równe `NULL` (nie jest przypisany), to w wyniku pojawi się jako 'Adam | NULL'.

JOIN z klauzulą WHERE - Filtrowanie połączonych danych

SQL
SELECT U.imie, K.nazwa_klasy
FROM Uczniowie AS U
JOIN Klasy AS K ON U.id_klasy = K.id_klasy
WHERE K.nazwa_klasy = '3A';

-- Przykład łączenia 3 tabel
-- (Tabela Oceny(id_ucznia, ocena))
SELECT U.imie, K.nazwa_klasy, O.ocena
FROM Uczniowie AS U
JOIN Klasy AS K ON U.id_klasy = K.id_klasy
JOIN Oceny AS O ON U.id_ucznia = O.id_ucznia
WHERE O.ocena = 6;

Tak wygląda typowe zapytanie. Najpierw łączymy tabele (JOIN...ON...), a następnie filtrujemy *połączony* wynik (WHERE...). Drugi przykład pokazuje, że możemy łączyć wiele tabel 'łańcuchowo'.

Przykładowe Zadania Maturalne

Matura 2026Zadanie Zadanie Typu Maturalnego 1

Masz bazę danych 'Biblioteka' z tabelami: 'Ksiazki' (id_ksiazki, tytul, id_autora) oraz 'Autorzy' (id_autora, nazwisko). Napisz zapytanie SQL, które wyświetli tytuły książek napisanych przez autora o nazwisku 'Sienkiewicz'.

Wskazówka: Musisz połączyć (JOIN) tabele 'Ksiazki' i 'Autorzy' używając wspólnego klucza `id_autora`. Następnie przefiltruj (WHERE) połączone wyniki, aby znaleźć tylko wiersze, gdzie nazwisko w tabeli 'Autorzy' to 'Sienkiewicz'.

Pokaż szkic rozwiązania
1. Zacznij od SELECT: `SELECT K.tytul` (używamy aliasu K dla Ksiazki).
2. Określ tabelę główną: `FROM Ksiazki AS K`.
3. Dołącz tabelę autorów: `JOIN Autorzy AS A ON K.id_autora = A.id_autora`.
4. Przefiltruj wynik: `WHERE A.nazwisko = 'Sienkiewicz';`.
5. Pełne zapytanie: `SELECT K.tytul FROM Ksiazki AS K JOIN Autorzy AS A ON K.id_autora = A.id_autora WHERE A.nazwisko = 'Sienkiewicz';`
Matura 2024Zadanie 8.5 (Matura Próbna Grudzień 2024)

W bazie danych są tabele 'Wlasciciele' (id_wlasciciela, imie, nazwisko) oraz 'Samochody' (nr_rejestracyjny, marka, rok_produkcji, id_wlasciciela). Zapisz zapytanie SQL, w wyniku którego uzyskasz imiona i nazwiska właścicieli samochodów zarejestrowanych w Chorzowie (nr rejestracyjny rozpoczyna się od liter SH) i wyprodukowanych w 2020 roku. Nazwiska uporządkuj alfabetycznie.

Wskazówka: To jest idealny przykład zadania na JOIN + WHERE + ORDER BY. Musisz połączyć 'Wlasciciele' i 'Samochody' przez `id_wlasciciela`. Następnie w klauzuli WHERE musisz dać dwa warunki: jeden na rok (`rok_produkcji = 2020`) i jeden na numer rejestracyjny (użyj operatora `LIKE 'SH%'`). Na koniec posortuj (ORDER BY).

Pokaż szkic rozwiązania
1. Wybierz kolumny: `SELECT W.imie, W.nazwisko`
2. Określ tabelę bazową i alias: `FROM Wlasciciele AS W`
3. Dołącz tabelę Samochody: `JOIN Samochody AS S ON W.id_wlasciciela = S.id_wlasciciela`
4. Filtruj połączone wyniki: `WHERE S.nr_rejestracyjny LIKE 'SH%' AND S.rok_produkcji = 2020`
5. Posortuj na końcu: `ORDER BY W.nazwisko ASC;`

Częste Błędy

Brak warunku ON (CROSS JOIN)

Piszesz `SELECT * FROM Uczniowie JOIN Klasy;` (bez `ON`). Baza danych łączy wtedy *każdy* wiersz z *każdym* wierszem (tzw. iloczyn kartezjański). Jeśli masz 100 uczniów i 10 klas, dostaniesz 1000 wierszy! To prawie zawsze błąd.

Poprawka: Zawsze po `JOIN` dodawaj warunek `ON`, który mówi, jak połączyć tabele (np. `ON U.id_klasy = K.id_klasy`).

Niejednoznaczna nazwa kolumny (Ambiguous column)

Obie tabele, `Uczniowie` i `Klasy`, mają kolumnę `id_klasy`. Piszesz `SELECT id_klasy FROM ...`. Baza danych odpowiada błędem: 'Nie wiem, czy chodzi Ci o `id_klasy` z Uczniów, czy z Klas'.

Poprawka: Gdy kolumna występuje w obu tabelach, zawsze używaj pełnej nazwy lub aliasu: `SELECT Uczniowie.id_klasy ...` lub `SELECT U.id_klasy ...`.

Mylenie `WHERE` z `ON`

Warunek łączenia tabel (`id_klasy` musi się zgadzać) *powinien* być w `ON`. Warunki filtrujące (np. `nazwa_klasy = '3A'`) *powinny* być w `WHERE`.

Poprawka: Trzymaj się zasady: `ON` służy do łączenia, `WHERE` służy do filtrowania.

Używanie INNER JOIN zamiast LEFT JOIN

Zadanie brzmi: 'Wypisz *wszystkich* klientów i liczbę ich zamówień'. Używasz `INNER JOIN`. W wyniku nie ma klientów, którzy nie złożyli żadnego zamówienia. To błąd.

Poprawka: Jeśli w zadaniu jest słowo 'każdy', 'wszyscy', 'także ci bez...', od razu myśl o `LEFT JOIN`. (W tym przypadku: `FROM Klienci LEFT JOIN Zamowienia ...`).

Kluczowe Wnioski

  • `JOIN` służy do łączenia danych z wielu tabel.
  • Warunek łączenia podajesz *zawsze* w klauzuli `ON` (np. `ON A.id = B.a_id`).
  • `INNER JOIN` (lub samo `JOIN`) zwraca tylko te wiersze, które mają dopasowanie w obu tabelach.
  • `LEFT JOIN` zwraca *wszystkie* wiersze z lewej tabeli i dopasowania z prawej (albo `NULL`).
  • Używaj aliasów (np. `FROM Uczniowie AS U`), aby kod był krótszy i czytelniejszy.
  • Jeśli kolumna `id` jest w obu tabelach, musisz pisać `U.id` lub `K.id` (błąd 'Ambiguous column').

Najczęściej Zadawane Pytania

Jaka jest różnica między `JOIN` a `INNER JOIN`?

Na maturze - żadna. `JOIN` to po prostu skrót od `INNER JOIN`. Oba działają identycznie i zwracają tylko pasujące wiersze.

Co to jest klucz główny i obcy?

Klucz główny (np. `Klasy.id_klasy`) to unikalny identyfikator wiersza w 'głównej' tabeli. Klucz obcy (np. `Uczniowie.id_klasy`) to kolumna w 'podrzędnej' tabeli, która wskazuje na klucz główny. To po tych kluczach prawie zawsze łączysz tabele.

Kiedy muszę użyć `LEFT JOIN`?

Użyj `LEFT JOIN`, gdy zadanie każe Ci znaleźć coś, co *nie ma* odpowiednika. Na przykład: 'Wypisz nazwy obszarów, na których *żaden* łazik nie lądował' (Matura Maj 2025). Robisz `LEFT JOIN` z Obszarów do Lądowań i szukasz tych wierszy, gdzie dane lądowania są `NULL`.

Czy mogę łączyć więcej niż dwie tabele?

Tak, i na maturze często trzeba. Po prostu dodajesz kolejne `JOIN` jedno po drugim. Na przykład: `FROM A JOIN B ON A.id = B.a_id JOIN C ON B.id = C.b_id`.

Czy muszę pisać `Uczniowie.imie` jeśli `imie` jest tylko w jednej tabeli?

Nie musisz, ale to dobra praktyka. Jeśli kolumna `imie` jest tylko w tabeli `Uczniowie`, to `SELECT imie ...` zadziała. Ale jeśli kolumna `id_klasy` jest w obu, `SELECT id_klasy` nie zadziała - musisz napisać `SELECT U.id_klasy`.

Chcesz opanować wszystkie tematy maturalne?

Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.

Powiązane Tematy