KWALIFIKACJA INF3 - CZERWIEC 2023 (test 2)

PYTANIE NR 21.
Tabele: Studenci, Zapisy, Zajecia są powiązane relacją. Aby wybrać jedynie nazwiska studentów oraz odpowiadające im idZajecia dla studentów z grupy 15, należy wydać kwerendę
Ilustracja przedstawia diagram relacyjny baz danych oraz fragmenty zapytań SQL.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Aby zwrócić tylko nazwiska i odpowiadające im identyfikatory zajęć dla studentów z grupy 15, trzeba wykonać projekcję kolumn (nazwisko, idZajecia), połączyć tabele relacją przez JOIN (Studenci → Zapisy → Zajecia) oraz zastosować filtr WHERE ograniczający wyniki do grupy 15.

Pełne wyjaśnienie:

W tym typie zadania kluczowe jest rozpoznanie, że mamy relację pomiędzy trzema tabelami, gdzie Zapisy zwykle pełni rolę tabeli pośredniej (łączącej studentów z zajęciami). Aby uzyskać wynik "nazwisko studenta + idZajecia", kwerenda musi spełnić trzy warunki:

  • Projekcja: w SELECT wskazujemy wyłącznie wymagane kolumny, np. Studenci.nazwisko oraz Zapisy.idZajecia (albo kolumnę identyfikatora zajęć z tabeli Zajecia – zależnie od schematu).
  • Poprawne łączenie: potrzebne są JOIN-y zgodne z kluczami obcymi, typowo: Studenci łączy się z Zapisy po identyfikatorze studenta, a Zapisy łączy się z Zajecia po identyfikatorze zajęć.
  • Filtrowanie: klauzula WHERE ogranicza rekordy do studentów z grupy 15, np. warunkiem na kolumnie grupy w tabeli Studenci.

Poprawny schemat zapytania ma więc postać: SELECT nazwisko, idZajecia FROM Studenci JOIN Zapisy ... WHERE grupa = 15. Zwróć uwagę na spójność aliasów: jeśli tabela Zapisy ma alias ZP, to w SELECT i warunkach JOIN trzeba konsekwentnie używać ZP, a nie mieszać go z innym aliasem.

Dlaczego typowe odpowiedzi błędne odpadają? Zapytanie bez JOIN do tabeli Zapisy nie potrafi wiarygodnie powiązać studentów z zajęciami. Zapytanie bez WHERE zwróci dane dla wszystkich grup. Z kolei użycie niewłaściwych kolumn w warunkach łączenia (np. łączenie nazwiska z id) może dać losowe, "puste" lub zwielokrotnione wyniki (kartowanie), co jest częstą pułapką na egzaminie.

W praktyce egzaminacyjnej warto najpierw wypisać: (1) jakie kolumny mają być w wyniku, (2) przez jakie klucze tabele się łączą, (3) jaki filtr ogranicza zbiór. Dopiero potem składać składnię SQL.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Tabela pośrednia (np. Zapisy) przechowuje pary kluczy obcych, które łączą dwa byty, np. studenta i zajęcia. Dzięki temu jeden student może mieć wiele zajęć, a jedne zajęcia mogą mieć wielu studentów. W zapytaniu zwykle łączysz: Studenci → Zapisy → Zajecia.
W SELECT podajesz wyłącznie wymagane kolumny, np. nazwisko z tabeli Studenci oraz idZajecia z tabeli Zapisy (albo z Zajecia, jeśli tam jest właściwy identyfikator). Unikaj SELECT *, bo zwraca zbędne dane i utrudnia ocenę poprawności.
INNER JOIN zwraca tylko te wiersze, które mają dopasowanie w obu łączonych tabelach. Przy trzech tabelach robisz to etapami: najpierw łączysz Studenci z Zapisy po idStudenta, potem wynik łączysz z Zajecia po idZajecia. Brak dopasowania eliminuje rekord z wyniku.
Jeśli "grupa" jest cechą studenta, logicznie należy filtrować po kolumnie z tabeli Studenci, np. WHERE Studenci.grupa = 15. Wtedy ograniczasz zbiór studentów, a dopiero potem pobierasz powiązane z nimi zajęcia. To zmniejsza ryzyko złego filtrowania po niewłaściwej tabeli.
Najczęściej: (1) użycie aliasu w SELECT, którego nie zdefiniowano w FROM/JOIN, (2) mieszanie dwóch aliasów dla tej samej tabeli (np. raz Z, raz ZP), (3) pominięcie prefiksu aliasu przy kolumnach o tej samej nazwie w wielu tabelach. Pomaga konsekwencja i krótki, czytelny zapis.
Nie zawsze. Jeśli wymagane jest wyłącznie idZajecia i jest ono w tabeli Zapisy, to JOIN do Zajecia może być zbędny. Jeśli jednak idZajecia w Zapisy jest kluczem obcym, a zadanie w praktyce wymaga potwierdzenia istnienia zajęć lub pobrania ich danych, wtedy JOIN do Zajecia ma sens.
Szukaj par: klucz główny w tabeli nadrzędnej (np. Studenci.idStudenta) i klucz obcy w tabeli zależnej (np. Zapisy.idStudenta). Analogicznie dla zajęć: Zajecia.idZajecia i Zapisy.idZajecia. JOIN powinien łączyć te pola równością, aby odwzorować relację.
Użyj DISTINCT, gdy chcesz usunąć duplikaty w wyniku, np. gdy jeden student ma wiele wpisów powodujących powtarzanie tej samej pary (nazwisko, idZajecia) albo gdy połączenia generują powielenia. Jeśli relacje i klucze są poprawne, DISTINCT często nie jest potrzebny, ale bywa "ratunkiem" przy duplikatach.
SELECT * zwraca wszystkie kolumny, przez co wynik nie odpowiada wymaganiu "jedynie nazwiska i idZajecia". Dodatkowo utrudnia ocenę, czy rozumiesz projekcję danych. Na egzaminie zwykle punktowana jest umiejętność wskazania konkretnych pól oraz poprawnego łączenia tabel, a nie maksymalna ilość danych.
Kartowanie (zbyt dużo wierszy) pojawia się, gdy brakuje warunku łączenia lub jest on błędny. Szybka kontrola: upewnij się, że każdy JOIN ma ON z parą klucz główny–klucz obcy, a nie przypadkowe pola. Jeśli widzisz JOIN bez ON albo ON z niepowiązanymi kolumnami, wynik będzie podejrzany.
info

To pytanie poprawnie rozwiązuje 49% zdających egzamin. trudne

Źródła:

  • PostgreSQL Documentation: "SELECT" (joins, FROM, WHERE) - https://www.postgresql.org/docs/current/sql-select.html - dostęp 2026-02-27
  • MySQL 8.0 Reference Manual: "JOIN" (inner join syntax) - https://dev.mysql.com/doc/refman/8.0/en/join.html - dostęp 2026-02-27
  • SQLite Documentation: "SELECT" (FROM clause, join, where) - https://sqlite.org/lang_select.html - dostęp 2026-02-27

Materiały:

  • Dokumentacja systemu bazy danych używanego na zajęciach (JOIN/SELECT/WHERE)
  • Ćwiczenia z modelowania relacji wiele-do-wielu (tabela pośrednia) i tworzenia kwerend
  • Zadania praktyczne: pisanie kwerend z aliasami i wieloma JOIN na przykładowej bazie szkolnej

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego