KWALIFIKACJA INF3 - STYCZEŃ 2020

PYTANIE NR 18.
Tabele Osoby i Adresy są połączone relacją jeden do wielu. Jakie zapytanie SQL należy zapisać, aby korzystając z tej relacji, prawidłowo wyświetlić nazwiska oraz przyporządkowane im miasta?
Ilustracja przedstawia diagram bazy danych, który jest używany w kontekście egzaminu zawodowego dla technika programisty.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawne zapytanie musi połączyć tabele Osoby i Adresy po kluczu obcym, aby każdej osobie przypisać właściwy rekord adresu. Konstrukcja JOIN z warunkiem ON (Osoby.Adresy_id = Adresy.id) zwraca nazwisko oraz miasto z odpowiadającego adresu. Pozostałe propozycje albo łączą rekordy błędnie, albo wcale ich nie wiążą.

Pełne wyjaśnienie:

W relacyjnej bazie danych relacja jeden do wielu zwykle oznacza, że jedna pozycja w tabeli "po stronie 1" (np. jeden adres) może być powiązana z wieloma rekordami "po stronie N" (np. wiele osób może wskazywać ten sam adres). Technicznie realizuje się to przez klucz obcy w tabeli po stronie "wiele".

Aby wyświetlić nazwiska i przypisane miasta, zapytanie musi:

  • pobrać kolumnę z tabeli Osoby (np. nazwisko),
  • pobrać kolumnę z tabeli Adresy (np. Miasto),
  • połączyć rekordy warunkiem zgodnym z relacją, czyli klucz obcy = klucz główny.

Spełnia to zapytanie: SELECT nazwisko, Miasto FROM Osoby JOIN Adresy ON Osoby.Adresy_id = Adresy.id;. Złączenie JOIN (domyślnie typu INNER) zwróci tylko te osoby, dla których istnieje pasujący rekord w tabeli Adresy.

Dlaczego pozostałe odpowiedzi są błędne?

  • Łączenie po Osoby.id = Adresy.id jest niepoprawne, jeśli relacja jest zdefiniowana przez Osoby.Adresy_id. To typowy błąd "zgadywania", że kolumny id zawsze się parują, co prowadzi do losowych lub pustych dopasowań.
  • Błędna składnia z podwójnym FROM nie wykona się w poprawnym SQL — to nie jest prawidłowa konstrukcja SELECT.
  • Brak warunku łączenia (same dwie tabele w FROM) tworzy iloczyn kartezjański: każda osoba zostanie zestawiona z każdym adresem, więc miasta nie będą "przyporządkowane", tylko powielone w wielu kombinacjach.

Wskazówka egzaminacyjna: gdy widzisz relację 1:N i chcesz "dopiąć" dane z tabeli powiązanej, szukaj w tabeli po stronie N kolumny będącej kluczem obcym (np. *_id) i użyj jej w warunku ON.

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ę to tak, że tabela po stronie "wiele" zawiera klucz obcy wskazujący klucz główny tabeli po stronie "jeden".
Szukaj pary: klucz obcy w jednej tabeli i odpowiadający mu klucz główny w drugiej. Przykład: Osoby.Adresy_id (FK) powinno wskazywać Adresy.id (PK). Właściwe połączenie trafia wtedy do warunku ON.
Samo wpisanie dwóch tabel w FROM bez warunku łączenia tworzy iloczyn kartezjański (każdy rekord z każdą kombinacją). JOIN z warunkiem ON powoduje, że rekord osoby zostanie skojarzony tylko z właściwym rekordem adresu.
Warunek ON definiuje, jak dopasować wiersze z dwóch tabel. Najczęściej porównuje klucz obcy z kluczem głównym, np. Osoby.Adresy_id = Adresy.id. Bez poprawnego ON wyniki mogą być błędnie sparowane albo sztucznie rozmnożone.
Najczęstsze błędy to: łączenie po nie tych kolumnach (np. id=id "bo tak"), brak warunku łączenia (iloczyn kartezjański), mylenie kolejności składni SELECT/FROM/ON oraz literówki w nazwach pól. Warto zawsze wskazać FK→PK w ON.
Nie zawsze, ale jest ryzykowne. Konstrukcja "FROM A, B WHERE …" może działać jak starszy zapis złączenia, o ile w WHERE jest poprawny warunek łączenia. W zadaniach egzaminacyjnych preferuje się czytelny JOIN … ON, bo jednoznacznie pokazuje relację.
LEFT JOIN stosuje się, gdy chcesz pokazać wszystkie osoby nawet wtedy, gdy nie mają przypisanego adresu (wtedy pola z Adresy będą NULL). INNER JOIN pokaże tylko osoby, dla których istnieje pasujący rekord adresu.
Jeśli liczba wierszy wyniku jest podejrzanie duża (np. zbliżona do iloczynu liczby rekordów w tabelach), to zwykle znak braku lub błędu warunku łączenia. Upewnij się, że jest JOIN z ON albo w WHERE jest warunek FK=PK.
To pole przechowuje identyfikator rekordu z tabeli Adresy, z którym dana osoba jest powiązana. Dzięki temu można pobrać dane adresowe (np. miasto) bez ich dublowania w tabeli Osoby. W SQL wykorzystuje się je w ON: Osoby.Adresy_id = Adresy.id.
Ćwicz na prostych schematach 2–3 tabel: relacje 1:N i N:M. Zawsze: (1) wskaż klucz obcy, (2) zapisz JOIN … ON, (3) wybierz kolumny w SELECT, (4) sprawdź, czy bez ON nie powstaje mnożenie wierszy. To daje szybkie i pewne odpowiedzi.
info

Około 54% zdających odpowiada poprawnie na to pytanie. trudne

Według specjalistów z branży: "Poprawne zapytanie musi połączyć tabele Osoby i Adresy po kluczu obcym, aby każdej osobie przypisać właściwy rekord adresu."

Źródła:

  • MySQL 8.0 Reference Manual: "JOIN Clause" (INNER JOIN, ON) https://dev.mysql.com/doc/refman/8.0/en/join.html - dostęp 2026-03-01
  • PostgreSQL Documentation: "SELECT" / "FROM Clause" / "Joins Between Tables" https://www.postgresql.org/docs/current/queries-table-expressions.html - dostęp 2026-03-01
  • SQLite Documentation: "SELECT" i opis JOIN (złączenia i warunki) https://www.sqlite.org/lang_select.html - dostęp 2026-03-01

Materiały:

  • Dokumentacja wybranego DBMS: sekcja JOIN/SELECT
  • Ćwiczenia z projektowania relacji 1:N i definiowania kluczy obcych
  • Zadania praktyczne: łączenie 2–3 tabel i filtrowanie wyników WHERE

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego