TOP 10 Najtrudniejszych zadań SQL - Egzamin INF.03

Ranking najtrudniejszych zadań z kwerend SQL z egzaminów INF.03


#1 -- inf03_2025_06_09 (Trudność: 8/10)

Temat: Remonty -- zlecenia i wykonawcy

Polecenie z arkusza:

Baza danych remonty zawiera cztery tabele. Tabela wykonanie łączy relacją wykonawców i zlecenia (jedno zlecenie może być wykonane przez wielu wykonawców). Tabela zlecenia opisuje zlecenia remontu przez klientów. Pole rodzaj przyjmuje wartości malowanie lub gipsowanie.

  • Zapytanie 1: wybierające jedynie średnią liczbę pracowników w firmach, minimalną liczbę pracowników i maksymalną liczbę pracowników. Kolumnom należy nadać nazwy (aliasy), kolejno: "srednia", "najmniej", "najwiecej"
  • Zapytanie 2: wybierające jedynie nazwy firm i liczbę pracowników dla firm, w których liczba pracowników wynosi 40 i więcej
  • Zapytanie 3: wybierające bez powtórzeń jedynie nazwy miast, z których pochodzą klienci, posortowane rosnąco według nazwy miasta
  • Zapytanie 4: wybierające jedynie imiona klientów oraz ceny ich zleceń tylko dla klientów z Poznania, którzy zamówili malowanie. Należy posłużyć się relacją
  • Zapytanie 5: wybierające jedynie imiona klientów oraz nazwy firm wykonujących dla nich zlecenia. Należy posłużyć się relacją

Dlaczego najtrudniejsze: Jedyne zadanie z JOINem przez 4 tabele (klienci -> zlecenia -> wykonanie -> wykonawcy) plus 5 kwerend, funkcje agregujące AVG/MIN/MAX, DISTINCT z ORDER BY.

Na co zwrócić uwagę:

  • Tabela pośrednia wykonanie łączy zlecenia z wykonawcami (relacja wiele-do-wielu)
  • Kolejność JOINów: musisz przejść przez cały łańcuch tabel
  • 3 funkcje agregujące w jednym SELECT (AVG, MIN, MAX)

#2 -- inf03_2025_06_08 (Trudność: 7.5/10)

Temat: Parada smoków

Polecenie z arkusza:

Baza danych smoki zawiera tabele połączone relacją.

  • Zapytanie 1: wybierające jedynie nazwę, długość i szerokość smoka, dla smoków z Polski
  • Zapytanie 2: wybierające niepowtarzające się kraje pochodzenia smoków, posortowane rosnąco według kraju pochodzenia
  • Zapytanie 3: wybierające jedynie rok z tabeli parada i obliczająca odpowiadającą mu średnią wartość długości z tabeli smok, nazwa kolumny (alias) "Srednia dlugosc" tylko dla lat po 2005 roku. Należy posłużyć się relacją i zgrupować rekordy względem roku
  • Zapytanie 4: zmieniające strukturę tabeli parada, przez wstawienie nowej kolumny lokalizacja typu napisowego o maksymalnej długości 100 znaków

Dlaczego trudne: JOIN przez 3 tabele (parada -> udział -> smok) z tabelą pośrednią, połączony z AVG + GROUP BY + WHERE w jednym zapytaniu.

Na co zwrócić uwagę:

  • Kwerenda 3 łączy aż 5 koncepcji: JOIN + JOIN + WHERE + AVG + GROUP BY
  • Tabela udzial to tabela pośrednia w relacji wiele-do-wielu
  • ALTER TABLE -- zmiana struktury tabeli (nie tylko danych)

#3 -- inf03_2026_01_05 (Trudność: 7.5/10)

Temat: Zgłoszenia -- personel i pojazdy służb

Polecenie z arkusza:

Baza danych zgłoszenia zawiera połączone relacją tabele: personel, rejestr, pojazdy. Tabele opisują rejestr zgłoszeń oraz przypisane do nich dane dotyczące personelu oraz pojazdów. W polu personel.status znajdują się wpisy: 'policjant' lub 'ratownik'. W polu pojazdy.typ znajdują się wpisy: 'K' lub 'R' oznaczające karetkę lub radiowóz.

  • Zapytanie 1: wybierające jedynie identyfikatory, imiona i nazwiska tych osób spośród personelu, których status to policjant
  • Zapytanie 2: wybierające jedynie typ i zliczające liczbę pojazdów zgrupowanych według typu (zapytanie wybiera liczbę karetek i radiowozów)
  • Zapytanie 3: wybierające jedynie te identyfikatory i nazwiska osób spośród personelu, których id nie pojawia się w rejestrze
  • Zapytanie 4: wstawiające rekord do tabeli rejestr: identyfikator personelu: 1, identyfikator pojazdu: 14, automatycznie wpisywana aktualna data, klucz generowany automatycznie

Dlaczego trudne: Kwerenda 3 wymaga LEFT JOIN + WHERE ... IS NULL (wzorzec "znajdź rekordy bez dopasowania w drugiej tabeli") -- jedno z najtrudniejszych do intuicyjnego wymyślenia rozwiązań. Plus COUNT z GROUP BY i INSERT z CURDATE().

Na co zwrócić uwagę:

  • Kwerenda 3: LEFT JOIN + IS NULL -- wzorzec "anti-join", którego nie da się zrobić zwykłym JOINem
  • INNER JOIN zwróciłby tylko personel, który JEST w rejestrze -- LEFT JOIN zwraca wszystkich, a IS NULL filtruje tych bez dopasowania
  • Kwerenda 4: NULL w INSERT dla kolumny z AUTO_INCREMENT pozwala bazie nadać klucz automatycznie
  • CURDATE() -- aktualna data, uniwersalna dla każdego dnia wykonania

#4 -- inf03_2026_01_10 (Trudność: 7.5/10)

Temat: Blog kulinarny -- przepisy i alergeny

Polecenie z arkusza:

Baza danych przepisy zawiera połączone relacją tabele. Tabela potrawy jest w relacji n:m z tabelą alergeny, za pomocą tabeli pośredniczącej lista_alergenow. Tabela potrawy jest w relacji n:1 z tabelą rodzaje, która opisuje rodzaje potraw: ciasta, dania mięsne itd.

  • Zapytanie 1: wybierające jedynie nazwę, trudność i kalorie potrawy o identyfikatorze równym 7
  • Zapytanie 2: wybierające jedynie nazwę potrawy i odpowiadające jej pole rodzaj z tabeli rodzaje dla potrawy o identyfikatorze równym 7. Należy posłużyć się relacją
  • Zapytanie 3: wybierające jedynie nazwę potrawy i odpowiadające jej nazwy alergenów dla potrawy o identyfikatorze równym 7. Zapytanie wykorzystuje relację n:m pomiędzy trzema tabelami
  • Zapytanie 4: wybierające jedynie pola przepis i plik dla potrawy o identyfikatorze równym 7

Dlaczego trudne: Relacja wiele-do-wielu z tabelą pośrednią lista_alergenow, wymaga 3-tabelowego JOINa.

Na co zwrócić uwagę:

  • Relacja wiele-do-wielu: potrawy <-> alergeny przez tabelę pośrednią
  • Kwerenda 3: dwa JOINy w jednym zapytaniu

#5 -- inf03_2025_06_05 (Trudność: 7/10)

Temat: Drukarnia -- zamówienia zdjęć

Polecenie z arkusza:

Baza danych fotografia zawiera tabele zamowienia i rodzaje_papieru. Kluczem obcym dla relacji jest pole rodzaj w tabeli zamówienia.

  • Zapytanie 1: wybierające jedynie pola plik, nr_klienta, liczba_odbitek dla zamówień na papierze matowym, z liczbą odbitek większą od 100
  • Zapytanie 2: wybierające dla klienta o identyfikatorze 3 wartości jego zamówień, obliczane na podstawie liczby odbitek i ceny, nazwa kolumny (alias) "Do zapłaty". Należy posłużyć się relacją
  • Zapytanie 3: zliczające sumę wszystkich odbitek na papierze błyszczącym
  • Zapytanie 4: tworzące konto użytkownika Anna na localhost z hasłem @NNa

Dlaczego trudne: JOIN po kolumnie która NIE jest kluczem (rodzaj), obliczenia arytmetyczne w SELECT, CREATE USER.

Na co zwrócić uwagę:

  • Kwerenda 2: JOIN po kolumnie rodzaj zamiast po ID -- to nietypowe!
  • Mnożenie kolumn z różnych tabel w SELECT
  • CREATE USER -- administracja bazy danych

#6 -- inf03_2024_06_07 (Trudność: 7/10)

Temat: Ważenie pojazdów

Polecenie z arkusza:

Baza danych wazenietirow zawiera tabele wagi i lokalizacje połączone relacją 1..n. Pole waga przechowuje wartości wagi w tonach na jedną oś pojazdu.

  • Zapytanie 1: aktualizujące tabelę wagi. Rekordy, w których pole lokalizacje_id jest równe: 2, 3, 4 mają zmienione datę i czas na wartości aktualne. Zapytanie ma charakter uniwersalny, zawsze zmienia wartość na aktualną datę / czas
  • Zapytanie 2: wybierające jedynie ulice z tabeli lokalizacje
  • Zapytanie 3: wstawiające do tabeli wagi rekord z danymi: lokalizacje_id: 5, waga: losowa liczba z przedziału 1..10 (wygenerowana funkcją), rejestracja: DW12345, aktualna data (do pola dzien) i aktualny czas (do pola czas). Klucz główny nadawany automatycznie. Zapytanie ma charakter uniwersalny, zawsze wstawia wartość aktualnej daty i czasu
  • Zapytanie 4: wybierające jedynie pola rejestracja, waga, dzien, czas z tabeli wagi i odpowiadające mu pole ulica z tabeli lokalizacje dla pojazdów, których waga na oś przekracza 5 t. Należy posłużyć się relacją

Dlaczego trudne: INSERT z zagnieżdżonymi funkcjami FLOOR(RAND()*10+1), UPDATE z CURRENT_DATE/CURRENT_TIME i BETWEEN.

Na co zwrócić uwagę:

  • FLOOR(RAND()*10+1) -- generowanie losowej liczby całkowitej 1-10 w INSERT
  • CURRENT_DATE i CURRENT_TIME -- dynamiczne wartości
  • BETWEEN w UPDATE -- zakres wartości

#7 -- inf03_2026_01_07 (Trudnosc: 7/10)

Temat: Pogoda -- pomiary temperatury w miejscowosciach

Polecenie z arkusza: Baza danych pogoda zawiera polaczone relacja tabele: miejscowosc, miesiace, pomiary. Tabele opisuja pomiary temperatury dla roznych miejscowosci w roznych porach roku i miesiacach.

  • Zapytanie 1: liczace srednia temperature dla miesiaca o identyfikatorze 7. Wyliczona wartosc jest zaokraglona do dwoch miejsc po przecinku
  • Zapytanie 2: wstawiajace do tabeli miejscowosc wiersz z danymi "Kijow", "Ukraina". Klucz nadawany automatycznie
  • Zapytanie 3: wybierajace jedynie nazwy miast i krajow z tabeli miejscowosc oraz odpowiadajace im temperatury w miesiacu o identyfikatorze 7. Nalezy posluzyc sie relacja
  • Zapytanie 4: wybierajace jedynie nazwy miesiecy z tabeli miesiace oraz odpowiadajace im srednie temperatury. Nalezy posluzyc sie relacja

Dlaczego trudne: Kwerenda 4 laczy JOIN + AVG + GROUP BY -- trzeba pogrupowac po id_miesiac, a wyswietlic nazwe miesiaca z drugiej tabeli. Plus ROUND(AVG()) w kwerendzie 1 i INSERT z NULL dla auto-klucza.

Na co zwrocic uwagę:

  • Kwerenda 4: JOIN + AVG + GROUP BY w jednym zapytaniu -- klasyczny wzorzec "srednia per kategoria"
  • ROUND(AVG(x), 2) -- zaokraglenie sredniej do 2 miejsc po przecinku
  • NULL w INSERT dla kolumny z AUTO_INCREMENT
  • Grupowanie po id_miesiac przy wyswietlaniu nazwy z drugiej tabeli -- obie kolumny sa funkcyjnie zalezne, wiec dziala

#8 -- inf03_2025_01_10 (Trudnosc: 7/10)

Temat: Szachy -- zawodnicy kola szachowego

Polecenie z arkusza: Baza danych szachy zawiera jedna tabele zawodnicy z informacjami o klasach, pseudonimach, zdobytych tytulach i rankingach. W tabeli znajduje sie rowniez pole data_zdobycia.

  • Zapytanie 1: wybierajace jedynie pseudonim, tytul, ranking i klase dla rankingow wiekszych od 2787, posortowane malejaco wedlug rankingu
  • Zapytanie 2: wybierajace losowo dokladnie dwa rekordy zlozone z pol pseudonim i klasa z tabeli zawodnicy
  • Zapytanie 3: aktualizujace dane w kolumnie klasa. Klasa "4A" jest aktualizowana do "5A"
  • Zapytanie 4: wybierajace dla zawodnikow z niepustym tytulem jedynie pseudonim i date zdobycia oraz obliczajace ile minelo dni od daty zdobycia tytulu do dnia dzisiejszego. Obliczona liczba dni powinna byc zapisana pod nazwa kolumny (aliasem) "dni"

Dlaczego trudne: Najtrudniejsza kwerenda 4 -- DATEDIFF z CURRENT_DATE() liczacy roznice w dniach miedzy dwiema datami. Plus ORDER BY RAND() LIMIT 2 (losowe rekordy) i porownanie do pustego stringa zamiast NULL.

Na co zwrocic uwagę:

  • Kwerenda 4: DATEDIFF(data1, data2) zwraca liczbe dni miedzy datami
  • CURRENT_DATE() w argumencie funkcji -- dynamiczne "do dzis"
  • Kwerenda 2: ORDER BY RAND() LIMIT n -- klasyczny sposob na losowe rekordy
  • tytul != '' -- niepusty tytul (pole tekstowe puste, NIE NULL)

#9 -- inf03_2024_06_03 (Trudność: 6.5/10)

Temat: Poziomy rzek -- wodowskazy i pomiary

Polecenie z arkusza:

Baza danych rzeki zawiera tabele wodowskazy i pomiary połączone relacją 1..n.

  • Zapytanie 1: wybierające jedynie pola nazwa, rzeka, stanAlarmowy z tabeli wodowskazy
  • Zapytanie 2: wybierające jedynie pola nazwa, rzeka, stanOstrzegawczy, stanAlarmowy z tabeli wodowskazy oraz odpowiadające im pole stanWody z tabeli pomiary dla daty pomiaru 2022-05-05. Należy posłużyć się relacją
  • Zapytanie 3: wybierające jedynie pola nazwa, rzeka, stanOstrzegawczy, stanAlarmowy z tabeli wodowskazy oraz odpowiadające im pole stanWody z tabeli pomiary dla daty pomiaru 2022-05-05 oraz takie, dla których stanWody jest wyższy niż stanOstrzegawczy. Należy posłużyć się relacją
  • Zapytanie 4: wybierające jedynie datę pomiaru oraz liczące średnie stany wody z tabeli pomiary grupując je według daty pomiaru

Dlaczego trudne: Porównanie kolumn z różnych tabel po JOINie (stanWody > stanOstrzegawczy).

Na co zwrócić uwagę:

  • Kwerenda 3: porównanie kolumn z RÓŻNYCH tabel po JOINie
  • Po JOINie masz dostęp do kolumn z obu tabel -- możesz je porównywać
  • AVG + GROUP BY w kwerendzie 4

#10 -- inf03_2025_06_07 (Trudnosc: 6.5/10)

Temat: Biuro turystyczne -- wyprawy i wycieczki

Polecenie z arkusza: Baza danych wyprawy zawiera polaczone relacja tabele miejsca i wycieczki.

  • Zapytanie 1: wybierajace jedynie nazwy wszystkich miejscowosci posortowane rosnaco
  • Zapytanie 2: wybierajace jedynie cene wycieczki do Malborka
  • Zapytanie 3: wybierajace jedynie nazwe, cene i link obrazu z tabeli miejsca dla wierszy, w ktorych link obrazu rozpoczyna sie od 0 (zero)
  • Zapytanie 4: wybierajace jedynie nazwy wszystkich miejsc i odpowiadajace im obliczone srednie liczby osob doroslych, zgrupowane wedlug nazw miejsc. Srednia liczba osob jest zaokraglona do liczby calkowitej. Nalezy posluzyc sie relacja
  • Zapytanie 5: tworzace tabele klienci z kolumnami: id_klienta jako liczba calkowita dodatnia, klucz podstawowy, autoinkrementowany, nie moze przyjmowac wartosci NULL; imie typu tekstowego o dlugosci do 20 znakow; nazwisko typu tekstowego o dlugosci do 40 znakow; data_ur typu data

Dlaczego trudne: Kwerenda 4 laczy JOIN + ROUND(AVG()) + GROUP BY w jednym zapytaniu. Plus kwerenda 5 -- CREATE TABLE z pelnymi ograniczeniami (UNSIGNED, PRIMARY KEY, AUTO_INCREMENT, NOT NULL) i LIKE z wzorcem zaczynajacym sie od konkretnego znaku.

Na co zwrocic uwagę:

  • Kwerenda 3: LIKE '0%' -- wzorzec zaczynajacy sie od 0 (% to dowolny ciag dalej)
  • Kwerenda 4: ROUND(AVG()) bez drugiego argumentu zaokragla do liczby calkowitej
  • Kwerenda 5: kolejnosc ograniczen kolumny: typ + UNSIGNED + PRIMARY KEY + AUTO_INCREMENT + NOT NULL
  • INT UNSIGNED -- liczba calkowita dodatnia (bez ujemnych)

Podsumowanie

Najtrudniejsze koncepcje SQL na egzaminie INF.03:

  1. JOIN przez 3-4 tabele (relacje wiele-do-wielu z tabelą pośrednią)
  2. Podzapytania (subquery) w WHERE
  3. Funkcje agregujące z GROUP BY (AVG, COUNT, SUM + GROUP BY)
  4. Zagnieżdżone funkcje (FLOOR(RAND()), ROUND(AVG()))
  5. Porównanie kolumn z różnych tabel po JOINie
  6. JOIN po kolumnie niebędącej kluczem

arkusze: link