KWALIFIKACJA INF3 - STYCZEŃ 2022

PYTANIE NR 24.
Tabele Osoby i Zainteresowania są połączone relacją jeden do wielu. Które zapytanie SQL należy zapisać, aby korzystając z tej relacji, prawidłowo wyświetlić imiona oraz odpowiadające im hobby?
Ilustracja przedstawia schemat bazy danych, który jest najprawdopodobniej używany w kontekście egzaminu zawodowego dla
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawne zapytanie wykorzystuje JOIN oraz warunek ON, który łączy wiersze z tabel na podstawie powiązanych kluczy (np. klucz obcy w Osoby i klucz główny w Zainteresowania). Dzięki temu każdy rekord osoby zostaje zestawiony z odpowiadającym mu hobby, bez tworzenia iloczynu kartezjańskiego ani błędnej składni.

Pełne wyjaśnienie:

W relacyjnych bazach danych relacja "jeden do wielu" jest realizowana najczęściej przez klucz obcy w tabeli po stronie "wiele", który wskazuje na klucz główny w tabeli po stronie "jeden" (albo odwrotnie – zależnie od przyjętego modelu). Aby wyświetlić imię osoby oraz odpowiadające mu hobby, trzeba połączyć obie tabele tak, aby serwer bazy danych wiedział, które wiersze do siebie pasują.

Zapytanie SELECT imie, hobby FROM Osoby JOIN Zainteresowania ON Osoby.Zainteresowania_id = Zainteresowania.id; jest poprawne, ponieważ:

  • używa jawnego złączenia JOIN,
  • zawiera warunek dopasowania w klauzuli ON,
  • pobiera dokładnie te kolumny, które są potrzebne do wyniku (imię i hobby).

Odpowiedź z warunkiem Osoby.id = Zainteresowania.id jest typowym błędem: łączy tabele po kolumnach o tej samej nazwie, ale bez gwarancji, że reprezentują to samo powiązanie. W praktyce może to dać brak wyników albo przypadkowe dopasowania.

Odpowiedź o nietypowej kolejności elementów (warunek między nazwą tabeli a FROM) jest po prostu niepoprawna składniowo w standardowym SQL, więc nie wykona się.

Zapytanie bez warunku łączenia (tylko dwie tabele w FROM) tworzy iloczyn kartezjański: każda osoba zostanie zestawiona z każdym hobby, co daje błędne i zwielokrotnione wyniki. Na egzaminie warto zapamiętać zasadę: jeśli w FROM są dwie tabele, to prawie zawsze potrzebujesz JOIN ... ON (albo WHERE z warunkiem łączenia), aby wynik był logicznie poprawny.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Relacja jeden do wielu oznacza, że jeden rekord w tabeli A może być powiązany z wieloma rekordami w tabeli B. Najczęściej realizuje się ją przez klucz obcy w tabeli po stronie "wiele", który wskazuje na klucz główny w tabeli po stronie "jeden".
JOIN łączy wiersze z dwóch tabel w jeden wynik, ale tylko wtedy, gdy spełniony jest warunek dopasowania. W praktyce podaje się go w klauzuli ON, np. gdy klucz obcy w tabeli Osoby wskazuje na identyfikator w tabeli Zainteresowania.
Bez warunku ON baza nie wie, które wiersze mają się ze sobą połączyć. Zwykle skończy się to błędem albo powstaniem iloczynu kartezjańskiego (każdy rekord z pierwszej tabeli z każdym z drugiej). ON precyzuje powiązanie po kluczach.
Tak, można użyć starszej składni: dwie tabele w FROM i warunek łączenia w WHERE. Działa to podobnie do INNER JOIN, ale łatwiej o pomyłkę (np. pominięcie warunku). Na egzaminie zwykle preferuje się czytelny zapis z JOIN ... ON.
Powstanie iloczyn kartezjański: liczba wierszy wyniku to (liczba osób) × (liczba hobby). Taki wynik prawie nigdy nie przedstawia realnych powiązań i prowadzi do duplikacji danych na ekranie lub w raporcie.
Szukaj pary: klucz obcy w jednej tabeli i odpowiadający mu klucz główny w drugiej. Częsty wzorzec to kolumna typu *_id, która wskazuje na id w tabeli słownikowej. Nie zakładaj automatycznie, że id=id zawsze oznacza właściwe powiązanie.
Najczęściej: brak warunku ON/WHERE (iloczyn kartezjański), łączenie po złych kolumnach (np. id=id bez sensu biznesowego), błędna składnia (pomieszane FROM/WHERE/ON) oraz wybór kolumn bez jednoznacznego wskazania tabeli, gdy nazwy się powtarzają.
INNER JOIN zwraca tylko te rekordy, które mają dopasowanie w obu tabelach. LEFT JOIN zwraca wszystkie rekordy z tabeli po lewej oraz dopasowania z prawej (a gdy ich brak, to wartości NULL). LEFT JOIN jest przydatny, gdy chcesz pokazać też osoby bez hobby.
Składnia z przecinkiem jest mniej czytelna, bo rozdziela informację o źródłach danych (FROM) i o powiązaniu (WHERE). Łatwiej zapomnieć o warunku łączenia, co tworzy błędny wynik. JOIN ... ON jasno pokazuje relację między tabelami w jednym miejscu.
Ćwicz krótkie zapytania SELECT na 2–3 tabelach: INNER JOIN i LEFT JOIN, warunki ON po kluczach, a także rozpoznawanie błędów (brak ON, złe kolumny). Dobrą metodą jest ręczne narysowanie relacji tabel i dopiero potem zapisanie JOIN.
info

Statystycznie 52% uczniów zna prawidłową odpowiedź. trudne

Eksperci podkreślają: "Poprawne zapytanie wykorzystuje JOIN oraz warunek ON, który łączy wiersze z tabel na podstawie powiązanych kluczy (np. klucz obcy w Osoby i klucz główny w Zainteresowania)."

Źródła:

  • MySQL 8.0 Reference Manual: "JOIN Clause" (SELECT Syntax) https://dev.mysql.com/doc/refman/8.0/en/join.html - accessed 2026-02-27
  • PostgreSQL Documentation: "FROM Clause" / "Joins Between Tables" https://www.postgresql.org/docs/current/queries-table-expressions.html - accessed 2026-02-27
  • SQLite Documentation: "SELECT" (Including JOIN usage) https://www.sqlite.org/lang_select.html - accessed 2026-02-27

Materiały:

  • Dokumentacja SQL wybranego silnika (MySQL/PostgreSQL/SQLite) – sekcja JOIN
  • Materiały do INF.3 z projektowania baz danych (normalizacja, klucze obce)
  • Ćwiczenia praktyczne: pisanie zapytań SELECT z INNER JOIN na 2–3 tabelach

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego