KWALIFIKACJA INF3 - CZERWIEC 2014

PYTANIE NR 19.
Według którego parametru oraz dla ilu tabel zostaną zwrócone wiersze na liście w wyniku przedstawionego zapytania?
Ilustracja przedstawia fragment kodu SQL, który jest częścią pytania egzaminacyjnego związanego z kwalifikacją zawodową
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawna jest odpowiedź "Według parametru nr id dla wszystkich tabel", ponieważ warunki producent.nr_id = hurtownia.nr_id, hurtownia.nr_id = sklep.nr_id oraz sklep.nr_id = serwis.nr_id łączą wszystkie 4 tabele po nr_id. Dodatkowo filtr producent.nr_id = 1, przez te równości, wymusza nr_id=1 we wszystkich tabelach wyniku.

Pełne wyjaśnienie:

Zapytanie używa listy tabel po przecinku w klauzuli FROM, co oznacza iloczyn kartezjański (CROSS JOIN), a następnie ogranicza go warunkami w WHERE. W praktyce takie warunki równościowe pełnią rolę złączeń (equi-join).

Kluczowe jest wskazanie, po jakiej kolumnie łączone są tabele i ile tabel obejmuje ten łańcuch złączeń:

  • Warunki producent.nr_id = hurtownia.nr_id, hurtownia.nr_id = sklep.nr_id oraz sklep.nr_id = serwis.nr_id tworzą spójny łańcuch, który obejmuje wszystkie cztery tabele. Oznacza to, że w wynikowych wierszach wartości nr_id muszą być takie same w producent, hurtownia, sklep i serwis.
  • Warunek producent.wyrob_id = serwis.wyrob_id łączy tylko dwie tabele: producent i serwis. Nie ma tu odwołania do hurtownia ani sklep, więc ten parametr nie jest "wspólny dla wszystkich".

Następnie pojawia się filtr producent.nr_id = 1. Ponieważ nr_id jest już użyte do powiązania wszystkich tabel, to równości w WHERE powodują "propagację" ograniczenia: skoro producent.nr_id ma wynosić 1, to aby spełnić równości, również hurtownia.nr_id, sklep.nr_id i serwis.nr_id muszą wynosić 1 w pasujących rekordach.

Dlatego odpowiedź "Według parametru nr id dla wszystkich tabel" jest poprawna: nr_id to parametr, który spina cały wynik obejmujący cztery tabele. Odpowiedzi odwołujące się do "wyrób id/wyrob_id" są błędne co do liczby tabel, bo ten warunek dotyczy tylko relacji producent–serwis. Warianty mówiące o "wyłącznie dla trzech tabel" są błędne, bo złączenia po nr_id obejmują cztery tabele wskazane w FROM.

Wskazówka egzaminacyjna: zawsze policz, w ilu tabelach występuje dana kolumna w warunkach złączeń i czy tworzy ona ciąg łączący wszystkie tabele, czy tylko fragment.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Zapis FROM t1, t2 oznacza iloczyn kartezjański (CROSS JOIN), czyli łączenie wszystkich wierszy t1 z wszystkimi wierszami t2. Dopiero warunki w WHERE mogą go ograniczyć i w praktyce "zamienić" w złączenie równościowe.
Parametr złączenia to kolumna występująca w warunku równości łączącym tabele, np. t1.id = t2.id. Jeśli taki łańcuch równości obejmuje wszystkie tabele w zapytaniu, to ta kolumna jest wspólnym "spoiwem" całego wyniku.
Ponieważ nr_id jest użyte do złączenia wszystkich tabel, to równości typu producent.nr_id = hurtownia.nr_id wymuszają zgodność wartości. Jeśli w producent ma być 1, to w pozostałych tabelach również musi być 1, inaczej wiersze nie przejdą warunków złączeń.
Wtedy warunek na wyrob_id ogranicza relację tylko między tymi dwiema tabelami (tu: producent i serwis). Pozostałe tabele są powiązane innymi warunkami (np. po nr_id). To typowy błąd: uznanie, że każda kolumna w WHERE spina wszystkie tabele.
Sprawdź, w ilu porównaniach występuje dana kolumna i czy powstaje ciąg łączący wszystkie tabele. Np. jeśli masz A.id=B.id, B.id=C.id, C.id=D.id, to kolumna id obejmuje 4 tabele. Jeśli warunek jest tylko A.x=D.x, obejmuje 2 tabele.
W typowych przypadkach tak: lista tabel po przecinku + warunki równościowe w WHERE daje efekt zbliżony do INNER JOIN. Różnica jest w czytelności i łatwości utrzymania kodu. Na egzaminie ważne jest rozumienie, że warunki w WHERE pełnią funkcję złączeń.
Najczęściej: (1) mylenie filtru z warunkiem złączenia, (2) zakładanie, że każda kolumna w WHERE dotyczy wszystkich tabel, (3) pomijanie jednego z warunków w łańcuchu (np. B.id=C.id), (4) nieuwaga na nazwy kolumn i literówki typu wyrob_id vs podobny zapis.
Gdy filtr dotyczy kolumny, która nie jest powiązana z innymi tabelami warunkami złączeń. Wtedy ogranicza tylko tę tabelę (lub tylko fragment złączenia). "Przechodzenie" działa w praktyce wtedy, gdy filtrujesz kolumnę używaną w równościowych złączeniach.
SELECT * oznacza wybór wszystkich kolumn ze wszystkich tabel biorących udział w zapytaniu. W tego typu pytaniach zwykle nie jest kluczowe, co wybierasz, tylko jak tabele są łączone i jaki filtr ogranicza wynik.
Ćwicz czytanie zapytań krok po kroku: wypisz tabele z FROM, zaznacz warunki złączeń (tabela.kolumna = tabela.kolumna), oddziel filtry (tabela.kolumna = stała), a potem określ, które kolumny łączą wszystkie tabele. Rozwiązuj krótkie testy z 3–5 tabelami.
info

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

Specjaliści zwracają uwagę: "Dodatkowo filtr producent.nr_id = 1, przez te równości, wymusza nr_id=1 we wszystkich tabelach wyniku."

Źródła:

  • PostgreSQL Documentation: "Joins Between Tables" (SELECT, CROSS JOIN, JOIN conditions), https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-JOIN - accessed 2026-03-14
  • MySQL 8.0 Reference Manual: "JOIN" and "Cartesian Product" (comma join and WHERE join conditions), https://dev.mysql.com/doc/refman/8.0/en/join.html - accessed 2026-03-14
  • SQLite Documentation: "SELECT" (FROM clause, join using comma syntax and WHERE constraints), https://sqlite.org/lang_select.html - accessed 2026-03-14

Materiały:

  • Dokumentacja DBMS (np. PostgreSQL/MySQL) rozdziały o JOIN i warunkach w WHERE
  • Materiały kursowe z relacyjnych baz danych: złączenia wewnętrzne i warunki złączeń
  • Zadania treningowe: analiza zapytań z wieloma tabelami i identyfikacja kolumn łączących

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego