ś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