KWALIFIKACJA INF3 - STYCZEŃ 2017

PYTANIE NR 21.
Tabela filmy zawiera klucz główny id oraz klucz obcy rezyserlD. Tabela rezyserzy zawiera klucz główny id. Obydwie tabele połączone są relacją jeden po stronie rezyserzy do wielu po stronie filmy. Ab y w kwerendzie SELECT połączyć tabele filmy i rezyserzy, należy zapisać
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W relacji 1:N tabela "filmy" przechowuje klucz obcy rezyserlD wskazujący na klucz główny id w tabeli "rezyserzy". Dlatego warunek złączenia w SELECT powinien porównywać FK z PK: filmy.rezyserlD = rezyserzy.id. Pozostałe warianty łączą niewłaściwe kolumny lub nieistniejące powiązania.

Pełne wyjaśnienie:

W modelu relacyjnym relacja jeden-do-wielu (1:N) oznacza, że jeden rekord w tabeli nadrzędnej (tu: rezyserzy) może być powiązany z wieloma rekordami w tabeli podrzędnej (tu: filmy). Technicznie realizuje się to tak, że tabela po stronie "wiele" przechowuje klucz obcy (FK), który wskazuje na klucz główny (PK) tabeli po stronie "jeden".

Skoro tabela filmy ma PK id oraz FK rezyserlD, a tabela rezyserzy ma PK id, to poprawne powiązanie jest następujące:

  • filmy.rezyserlD (FK) → rezyserzy.id (PK)

Dlatego w zapytaniu SELECT warunek w klauzuli ON powinien łączyć te właśnie kolumny: filmy.rezyserlD = rezyserzy.id. Taki zapis zwróci rekordy filmów wraz z odpowiadającymi im danymi reżysera.

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

  • filmy.id = rezyserzy.filmylD – odwołuje się do kolumny, której nie opisano w schemacie (po stronie reżyserów nie ma FK do filmów w relacji 1:N). Dodatkowo łączy PK filmów z hipotetycznym polem, co nie odpowiada opisanej relacji.
  • filmy.id = rezyserzy.id – łączy dwie niezależne kolumny PK z różnych tabel. Zbieżność wartości byłaby przypadkowa i nie reprezentuje relacji film–reżyser.
  • filmy.rezyserlD = rezyserzy.filmylD – po stronie reżyserów ponownie pojawia się pole niezgodne z opisem. W relacji 1:N nie oczekuje się w tabeli "jeden" listy identyfikatorów z tabeli "wiele".

Wskazówka egzaminacyjna: najpierw ustal, gdzie jest FK (zwykle w tabeli "wiele"), a potem w ON łącz FK = PK. To minimalizuje pomyłki typu "id=id".

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Klucz obcy to kolumna, która przechowuje wartość identyfikatora z innej tabeli i wskazuje na konkretny rekord. W przykładzie pole rezyserlD w tabeli filmy wskazuje na rezyserzy.id, dzięki czemu wiadomo, który reżyser jest przypisany do filmu.
Najczęściej rozpoznasz ją po tym, że tabela po stronie "wiele" ma kolumnę z kluczem obcym do tabeli po stronie "jeden". Jeden reżyser może mieć wiele filmów, więc w tabeli filmy jest FK do tabeli rezyserzy.
Warunek ON powinien łączyć klucz obcy z kluczem głównym, czyli zwykle: tabela_wiele.fk = tabela_jeden.pk. W tym schemacie: filmy.rezyserlD = rezyserzy.id.
Bo to dwa różne klucze główne, które identyfikują rekordy w swoich tabelach niezależnie. Równość tych wartości byłaby przypadkowa i nie oznacza powiązania film–reżyser. Poprawne łączenie wynika z FK, a nie z podobnej nazwy kolumn.
Błędny warunek może dać za dużo wierszy (np. prawie iloczyn kartezjański), za mało wierszy (brak dopasowań) albo przypadkowe dopasowania. W praktyce oznacza to błędne listy w aplikacji, złe raporty i trudne do wykrycia błędy logiczne.
Jeśli chcesz zwrócić tylko filmy, które mają przypisanego reżysera, typowym wyborem jest INNER JOIN. Gdy chcesz także filmy bez przypisanego reżysera (NULL w FK), stosuje się zwykle LEFT JOIN. Warunek ON pozostaje FK=PK.
Sprawdź opis/diagram bazy: klucz obcy jest w tabeli, która może mieć wiele rekordów powiązanych z jednym rekordem w tabeli nadrzędnej. Tu wiele filmów może wskazywać jednego reżysera, więc FK jest w tabeli filmy.
Najczęstsze to: łączenie PK z PK ("id=id"), pomylenie stron relacji (odwrócenie FK), literówki w nazwach kolumn, brak aliasów przy jednakowych nazwach pól oraz pomijanie warunku ON (co prowadzi do błędnych wyników).
Alias skraca nazwy i ułatwia czytanie: np. filmy f i rezyserzy r, a potem ON f.rezyserlD = r.id. To ogranicza pomyłki i dobrze działa w dłuższych zapytaniach z wieloma złączeniami.
Ćwicz na małych schematach 2–4 tabel: rozpoznawaj relacje 1:N i N:M, wskazuj FK oraz pisz SELECT z JOIN i ON. Zawsze zadaj sobie pytanie: "która kolumna przechowuje odwołanie do której tabeli?" i dopiero wtedy twórz warunek złączenia.
info

To pytanie poprawnie rozwiązuje 56% zdających egzamin. średnie

Specjaliści zwracają uwagę: "W relacji 1:N tabela "filmy" przechowuje klucz obcy rezyserlD wskazujący na klucz główny id w tabeli "rezyserzy"."

Źródła:

  • MySQL 8.0 Reference Manual: "JOIN Clause" (opis składni JOIN ... ON ...), https://dev.mysql.com/doc/refman/8.0/en/join.html - accessed 2026-02-18
  • PostgreSQL Documentation (current): "FROM Clause" / "Joined Tables" (JOIN i warunek ON), https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-JOIN - accessed 2026-02-18
  • SQLite Documentation: "SELECT" (JOIN i ON w zapytaniach), https://www.sqlite.org/lang_select.html - accessed 2026-02-18

Materiały:

  • Dokumentacja wybranego silnika SQL (np. MySQL/PostgreSQL): sekcja JOIN
  • Materiały o modelu relacyjnym: klucze, relacje 1:N, normalizacja
  • Ćwiczenia: pisanie zapytań SELECT z JOIN na przykładowych schematach (filmy–reżyserzy)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego