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
udzialto 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 NULLfiltruje tych bez dopasowania - Kwerenda 4:
NULLw 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
rodzajzamiast 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
NULLw INSERT dla kolumny z AUTO_INCREMENT- Grupowanie po
id_miesiacprzy 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:
- JOIN przez 3-4 tabele (relacje wiele-do-wielu z tabelą pośrednią)
- Podzapytania (subquery) w WHERE
- Funkcje agregujące z GROUP BY (AVG, COUNT, SUM + GROUP BY)
- Zagnieżdżone funkcje (FLOOR(RAND()), ROUND(AVG()))
- Porównanie kolumn z różnych tabel po JOINie
- JOIN po kolumnie niebędącej kluczem
arkusze: link