BAZY DANYCH · INF.03
Egzamin INF.03 — pełne scenariusze
To próba generalna: dostajesz opis biblioteki i musisz przejść całą drogę — projekt, utworzenie tabel, import, raporty, zmiany danych i eksport. Zadania łączą wszystkie wcześniejsze moduły.
Od wymagań do projektu bazy
Zadanie egzaminacyjne zaczyna się od opisu sytuacji, a nie od listy tabel. Trzeba z tekstu wyłowić encje, czyli osoby, rzeczy i zdarzenia, o których chcemy przechowywać dane. Pomagają w tym trzy pytania: kto? co? kiedy? W zdaniu „uczeń wypożycza książkę i ma termin zwrotu” występują uczeń, książka i wypożyczenie z datami. To już pierwszy szkic projektu.
Kolejny krok to atrybuty. Przy każdym bycie wypisujemy informacje, które trzeba zapamiętać: uczeń ma imię, nazwisko, klasę i datę urodzenia; książka ma tytuł, kategorię, wydawnictwo i cenę; wypożyczenie ma datę wypożyczenia, termin zwrotu i status. Cechy, które powtarzają się przy wielu rekordach, wynosimy do osobnych tabel. Dzięki temu nazwa kategorii nie jest wpisywana przy każdej książce, a wychowawca przy każdym uczniu.
SHOW TABLES;
DESCRIBE wypozyczenia;
SHOW CREATE TABLE ksiazki_autorzy;
Polecenie SHOW TABLES pokazuje listę tabel, DESCRIBE — kolumny i typy, a SHOW CREATE TABLE — pełną definicję z kluczami i silnikiem. To szybki sposób sprawdzenia, czy projekt w bazie odpowiada projektowi na papierze. Jeśli w tabeli wypozyczenia widzisz kolumnę tytul, to znak, że dane książki zostały zdublowane i trzeba je przenieść do tabeli ksiazki.
Relacje opisujemy między kluczami. Jeden uczeń ma wiele wypożyczeń, ale jedno wypożyczenie należy do jednego ucznia — to relacja jeden-do-wielu. Książka może mieć wielu autorów, a autor wiele książek — to relacja wiele-do-wielu, którą rozwiązuje tabela łącząca ksiazki_autorzy. Klucz główny identyfikuje wiersz, a klucz obcy wskazuje wiersz w innej tabeli. Para ksiazka_id i autor_id w tabeli łączącej jest unikalna, żeby ten sam autor nie został dopisany do tej samej książki dwa razy.
ksiazki_autorzy rozwiązuje relację wiele-do-wielu między książkami i autorami.| Fragment wymagań | Element projektu | Uzasadnienie |
|---|---|---|
| „uczeń należy do jednej klasy” | uczniowie.klasa_id jako FK |
wiele uczniów może wskazywać tę samą klasę |
| „każde wypożyczenie ma datę i termin” | kolumny DATE w tabeli wypozyczenia |
daty opisują zdarzenie, a nie osobę ani książkę |
| „książka może mieć wielu autorów” | tabela ksiazki_autorzy |
relacja wiele-do-wielu wymaga tabeli łączącej |
| „wydawnictwo ma nazwę i miasto” | osobna tabela wydawnictwa |
dane wydawnictwa nie powinny powtarzać się przy każdej książce |
Projekt warto sprawdzić normalizacją. Pierwsza postać normalna wymaga wartości atomowych — nie wolno wpisywać w jednej komórce listy autorów rozdzielonej przecinkami. Druga usuwa zależności częściowe od klucza złożonego, dlatego tabela ksiazki_autorzy nie przechowuje tytułu książki. Trzecia usuwa zależności przechodnie: miasto wydawnictwa zależy od wydawnictwa, a nie bezpośrednio od książki, więc należy do tabeli wydawnictwa. Zdenormalizowany raport można później zbudować widokiem, ale nie trzeba psuć przez to projektu tabel.
Przykłady z życia
1. Zapisy na wycieczkę. W arkuszu zapisów powtarzają się imię ucznia, klasa, nazwa wycieczki i wychowawca. Po zmianie wychowawcy trzeba poprawić wiele komórek. Podział na tabele uczniów, klas i wycieczek usuwa powtarzanie i zmniejsza ryzyko błędu.
2. Wypożyczalnia sprzętu sportowego. Uczeń wypożycza piłkę, a piłka ma numer, typ i stan. Wypożyczenie łączy ucznia, sprzęt, pracownika i daty. To ten sam schemat co biblioteka, tylko inne nazwy encji — dlatego warto uczyć się wzorca, a nie pojedynczego przykładu.
3. Sklep internetowy. Klient składa zamówienie, które zawiera wiele produktów. Jedno zamówienie ma wielu produktów, a jeden produkt może wystąpić w wielu zamówieniach. Tabela pozycji zamówienia rozwiązuje tę relację i przechowuje ilość oraz cenę z chwili zakupu.
Geografia: świat dzielimy na państwa, a państwa na miasta. Miasto należy do jednego państwa, ale państwo ma wiele miast — to relacja jeden-do-wielu. Gdyby w tabeli miast wpisać nazwę państwa w każdej komórce, literówka przy jednym mieście tworzyłaby pozornie nowe państwo.
W module 01 poznaliśmy encje i tabele, a w module 02 tworzyliśmy klucze w phpMyAdmin. Tutaj wracamy do projektu, ale patrzymy na niego jak na zadanie egzaminacyjne: od tekstu wymagań do ERD. W module 05 sprawdzisz projekt zapytaniami JOIN, a w kolejnych sekcjach utworzysz tabele, zaimportujesz dane i przygotujesz raport.
Matematyka: relacja to podzbiór iloczynu kartezjańskiego dwóch zbiorów. Para (uczen_id, ksiazka_id) w wypożyczeniu należy do iloczynu zbioru uczniów i zbioru książek. Klucz obcy pilnuje, żeby oba elementy pary naprawdę istniały.
Samorząd uczniowski chce wypożyczać sprzęt sportowy: piłki, rakiety i skakanki. Każdy sprzęt ma numer, nazwę, kategorię i stan. Uczeń może wypożyczyć wiele rzeczy, a jedna rzecz może być wypożyczana wielokrotnie. Wypożyczenie ma datę, termin zwrotu i pracownika odpowiedzialnego. Zaprojektuj tabele, klucze i relacje. Wskaż, gdzie przechowasz nazwę kategorii i dlaczego nie w tabeli wypożyczeń. Opisz, jak sprawdzisz projekt zapytaniem kontrolnym.
Pokaż przykładowe rozwiązanie i kryteria
Przykład: tworzę tabele sprzet (id, nazwa, kategoria_id, stan), kategorie_sprzetu (id, nazwa), uczniowie (id, imie, nazwisko, klasa_id) oraz wypozyczenia_sprzetu (id, uczen_id, sprzet_id, pracownik_id, data_wypozyczenia, termin_zwrotu). Kategoria jest słownikiem, więc jej nazwa występuje tylko w tabeli kategorii, a sprzęt wskazuje ją przez kategoria_id. Uczeń i sprzęt są kluczami obcymi w wypożyczeniu. Projekt sprawdzam zapytaniem JOIN, które pokazuje wypożyczenie razem z nazwą sprzętu i nazwiskiem ucznia; jeśli wynik ma puste kolumny, prawdopodobnie brakuje klucza obcego lub danych.
Kryteria: (1) encje — uczeń, sprzęt, kategoria, wypożyczenie i pracownik są osobnymi tabelami; (2) klucze — każda tabela ma klucz główny, a wypożyczenie dwa klucze obce do ucznia i sprzętu; (3) normalizacja — nazwa kategorii nie powtarza się w tabeli sprzętu ani wypożyczeń; (4) weryfikacja — uczeń proponuje konkretne zapytanie kontrolne i wyjaśnia, co sprawdza.
Tworzenie tabel, import i eksport
Projekt na papierze trzeba zamienić na konkretne polecenia. Zaczynamy od tabel nadrzędnych, bo klucz obcy wymaga, żeby tabela, do której wskazuje, już istniała. W schemacie biblioteki najpierw powstają klasy, kategorie, wydawnictwa i autorzy, potem uczniowie i ksiazki, a na końcu wypozyczenia, rezerwacje, opinie i ksiazki_autorzy. Ta kolejność wynika z zależności, a nie z kolejności alfabetycznej.
CREATE TABLE ksiazki_archiwum (
id INT UNSIGNED NOT NULL,
tytul VARCHAR(150) NOT NULL,
rok_wydania YEAR NOT NULL,
cena DECIMAL(6,2) NOT NULL,
data_archiwizacji DATE NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO ksiazki_archiwum
(id, tytul, rok_wydania, cena, data_archiwizacji)
SELECT id, tytul, rok_wydania, cena, '2026-11-04' AS data_archiwizacji
FROM ksiazki
WHERE rok_wydania < 1950;
W definicji tabeli każda kolumna ma typ i ograniczenia. INT UNSIGNED pasuje do identyfikatorów, VARCHAR(150) do tytułu, YEAR do roku, a DECIMAL(6,2) do ceny. Klucz główny zapewnia unikalność, a NOT NULL blokuje brak wartości. Tabela archiwalna nie ma klucza obcego do uczniów ani książek, bo ma przetrwać nawet po usunięciu oryginalnych rekordów. To świadoma decyzja projektowa: archiwum przechowuje kopię historii, a nie żywe powiązania.
-- Import z pliku CSV w phpMyAdmin:
-- 1. Wybierz tabelę i zakładkę Import.
-- 2. Wskaż plik CSV w kodowaniu UTF-8.
-- 3. Ustaw separator zgodny z plikiem (np. średnik).
-- 4. Zaznacz, że pierwszy wiersz zawiera nazwy kolumn.
-- 5. Sprawdź podgląd i kliknij Wykonaj.
SELECT COUNT(*) AS zaimportowane FROM ksiazki_archiwum;
Import CSV wymaga zgodności formatu. Data musi mieć postać RRRR-MM-DD, a cena kropkę dziesiętną, jeśli kolumna jest typu DECIMAL. Separator w pliku musi być taki sam jak ustawiony w imporcie — w polskim Excelu często jest to średnik, a nie przecinek. Pierwszy wiersz z nazwami kolumn warto zachować, ale trzeba powiedzieć phpMyAdmin, że go pomija. Po imporcie sprawdzamy liczbę wierszy i kilka rekordów, a nie tylko komunikat o sukcesie.
Eksport może obejmować całą bazę albo wybrane tabele. Format SQL zachowuje strukturę i dane, więc nadaje się do odtworzenia bazy. Format CSV jest wygodny do arkusza, ale nie przenosi kluczy ani typów. Przed eksportem warto zatrzymać zmiany w aplikacji, żeby plik nie zawierał połowy transakcji. Po eksporcie testowo zaimportuj go do innej bazy — to jedyny sposób, żeby sprawdzić, czy plik jest kompletny.
-- Wiersz poleceń Windows, nie edytor SQL:
-- mysqldump -u root -p --single-transaction --result-file=biblioteka.sql biblioteka_szkolna
-- Sprawdzenie po imporcie:
SHOW TABLES;
SELECT COUNT(*) AS ksiazki FROM ksiazki;
SELECT COUNT(*) AS wypozyczenia FROM wypozyczenia;
| Objaw | Prawdopodobna przyczyna | Co poprawić |
|---|---|---|
| błąd 1062 — duplikat | powtórzony klucz główny lub unikalny ISBN | usunąć duplikat z pliku lub użyć nowego numeru |
| błąd 1452 — klucz obcy | brakuje wiersza nadrzędnego, np. kategorii | najpierw zaimportować tabelę nadrzędną |
| błąd 1292 — zła data | data w formacie dziennym zamiast RRRR-MM-DD | przekonwertować kolumnę przed importem |
| błąd 1366 — zła wartość | cena z przecinkiem dziesiętnym lub tekst w kolumnie liczby | zamienić przecinek na kropkę i usunąć jednostki |
| za mało wierszy | pominięty pierwszy wiersz lub zły separator | sprawdzić podgląd i ustawienia importu |
Przykłady z życia
1. Przenoszenie kontaktów. Eksportujesz kontakty z telefonu do pliku CSV, a potem importujesz je na nowy telefon. Jeśli plik ma inny separator albo brakuje kolumny z numerem, import się nie uda. Kopia w formacie SQL byłaby tu bezużyteczna, bo telefon nie zna języka MySQL.
2. Inwentaryzacja biblioteki. Bibliotekarka dostaje od księgowej arkusz z nowymi książkami. Najpierw sprawdza, czy każdy tytuł ma kategorię i wydawnictwo, potem importuje dane do tabeli ksiazki. Dopiero na końcu liczy, czy liczba wierszy zgadza się z liczbą pozycji na fakturze.
3. Cennik w sklepie. Po zmianie cennika eksportuje się tabelę do CSV i wysyła do działu marketingu. Jeśli w pliku zostaną stare ceny, klienci zobaczą nieaktualną ofertę. Eksport jest więc nie tylko kopią, ale też publikacją danych — trzeba wiedzieć, dokąd trafia.
Informatyka: w zawodzie technika informatyka import danych to typowy etap migracji systemu. Administrator najpierw uruchamia go na kopii bazy, porównuje liczbę rekordów i dopiero potem powtarza operację na wersji produkcyjnej.
Historia: archiwum dokumentów przechowuje kopie nawet wtedy, gdy oryginały już nie istnieją. Tabela ksiazki_archiwum działa podobnie: nie jest już powiązana z żywą tabelą książek, ale pozwala odtworzyć stan katalogu z konkretnego dnia.
W module 02 tworzyliśmy pierwsze tabele i importowaliśmy całą bazę. Tutaj robimy to w scenariuszu egzaminacyjnym: od projektu przez CREATE TABLE po import wybranych danych. W module 07 przećwiczysz transakcje przy takich operacjach, a w module 08 zabezpieczysz kopię i dostęp do niej.
Język polski: nagłówek kolumny powinien być krótki i jednoznaczny. „Data” bez kontekstu może oznaczać datę wypożyczenia, zwrotu albo archiwizacji. W imporcie nie da się poprawić znaczenia po fakcie — trzeba ustalić je przed zapisaniem pliku.
Raport, DML i checklista egzaminacyjna
Zadanie INF.03 zwykle łączy kilka umiejętności: trzeba zaprojektować bazę, utworzyć tabele, zaimportować dane, napisać raport i wykonać zmianę danych. Największym wrogiem jest pośpiech. Zacznij od przeczytania całego polecenia i wypisania czasowników: „utwórz”, „zaimportuj”, „wyświetl”, „zaktualizuj”, „wyeksportuj”. Dopiero potem otwieraj phpMyAdmin. Każdy punkt ma osobny dowód do sprawdzenia, więc warto pracować w kolejności, która pozwala wrócić do wcześniejszego etapu bez paniki.
Raport najczęściej wymaga połączenia kilku tabel i agregacji. Przykład poniżej pokazuje liczbę wypożyczeń oraz sumę i średnią kar w każdej klasie. Grupowanie odbywa się po identyfikatorze i nazwie klasy, bo nazwa może się powtórzyć w kolejnych latach. Warunek HAVING ogranicza wynik do klas z co najmniej dziesięcioma wypożyczeniami, a sortowanie ustawia klasy z największą sumą kar na początku.
SELECT k.nazwa AS klasa,
COUNT(w.id) AS wypozyczenia,
SUM(w.kara) AS suma_kar,
ROUND(AVG(w.kara), 2) AS srednia_kara
FROM klasy k
JOIN uczniowie u ON u.klasa_id = k.id
JOIN wypozyczenia w ON w.uczen_id = u.id
GROUP BY k.id, k.nazwa
HAVING COUNT(w.id) >= 10
ORDER BY suma_kar DESC, klasa;
Druga część zadania często dotyczy zmiany danych. Wtedy liczy się nie tylko poprawny SQL, ale też kolejność i bezpieczeństwo. Najpierw sprawdzasz zasięg zapytaniem SELECT, potem wykonujesz UPDATE w transakcji, a na końcu weryfikujesz wynik. Jeśli zadanie mówi „zmień tylko przeterminowane wypożyczenia”, warunek musi zawierać status i datę, a nie sam identyfikator przypadkowego rekordu. Po COMMIT nie ma już prostego cofnięcia — zostaje kopia lub ręczne poprawki.
START TRANSACTION;
UPDATE wypozyczenia
SET status = 'zwrocone',
data_zwrotu = '2026-10-01',
kara = DATEDIFF('2026-10-01', termin_zwrotu) * 0.50
WHERE id IN (36, 37, 38);
-- Kontrola przed zatwierdzeniem:
SELECT id, status, data_zwrotu, kara
FROM wypozyczenia
WHERE id IN (36, 37, 38);
COMMIT;
Po każdej większej operacji wykonaj krótką kontrolę. SELECT COUNT(*) pokazuje, ile wierszy jest w tabeli, GROUP BY status — czy nie zostały dziwne stany, a SHOW CREATE TABLE — czy klucze i typy są takie jak w projekcie. Na egzaminie nie masz zwykle czasu na pełny audyt, ale trzy szybkie zapytania potrafią uratować całe zadanie. Lepiej zauważyć brakujący klucz obcy przed eksportem niż po oddaniu pracy.
SELECT status, COUNT(*) AS ile
FROM wypozyczenia
GROUP BY status;
SELECT COUNT(*) AS liczba_kar
FROM wypozyczenia
WHERE kara > 0;
SHOW CREATE TABLE wypozyczenia;
Eksport końcowy to nie tylko „zapisz plik”. Sprawdź, czy wybierasz właściwą bazę, czy eksport obejmuje strukturę i dane oraz czy plik nie zawiera przypadkowych tabel testowych. Jeśli zadanie wymaga pliku CSV, nie dodawaj do niego komentarzy ani dodatkowych nagłówków. Nazwij plik zgodnie z poleceniem i zapisz go w miejscu, które łatwo wskażesz nauczycielowi. Po eksporcie możesz wykonać testowy import do pustej bazy — to najlepszy dowód, że plik jest poprawny.
| Krok | Co zrobić | Kontrola |
|---|---|---|
| 1 | przeczytaj polecenie i wypisz czasowniki | czy rozumiesz każde polecenie |
| 2 | naszkicuj ERD i ustal klucze | czy relacje wiele-do-wielu mają tabelę łączącą |
| 3 | utwórz bazę i tabele od nadrzędnych do podrzędnych | SHOW CREATE TABLE |
| 4 | zaimportuj dane i sprawdź liczbę wierszy | COUNT(*) i wybrane rekordy |
| 5 | napisz raport z aliasami i sortowaniem | czy kolumny mają wymagane nazwy |
| 6 | wykonaj DML w transakcji | liczba zmienionych wierszy i SELECT po zmianie |
| 7 | sprawdź stany po DML | GROUP BY status |
| 8 | wykonaj eksport końcowy | właściwa baza, struktura i dane |
| 9 | zapisz plik pod wymaganą nazwą | testowy import lub podgląd pliku |
Przykłady z życia
1. Egzamin praktyczny. Zdający dostaje opis biblioteki i listę poleceń. Najpierw czyta całość, potem tworzy tabele, importuje dane i dopiero na końcu pisze raport. Osoba, która zaczyna od raportu bez tabel, traci czas na poprawianie nazw kolumn.
2. Raport dla dyrektora. Dyrektor chce wiedzieć, które klasy mają najwięcej wypożyczeń i kar. Raport musi mieć czytelne nagłówki i posortowane wyniki. Surowa tabela z 45 wierszami nie odpowiada na pytanie, dopóki nie zostanie zgrupowana.
3. Poprawka po błędzie. Po aktualizacji okazuje się, że zmieniono o jeden wiersz za dużo. Jeśli operacja była w transakcji, wystarczy ROLLBACK przed COMMIT. Jeśli nie, trzeba odtworzyć dane z kopii i jeszcze raz przeliczyć warunek. Dlatego transakcja jest tańsza niż odwaga.
Matematyka: raport z sumą i średnią trzeba sprawdzić bilansem: suma wartości w grupach powinna równać się sumie dla całej tabeli, jeśli żadna grupa nie została pominięta. To prosta kontrola, która wykrywa błąd JOIN lub zbyt wąski warunek.
W module 04 uczyliśmy się grupować, w module 05 łączyć tabele, a w module 07 bezpiecznie zmieniać dane. Tutaj składamy te umiejętności w jeden scenariusz. W module 08 przypomnisz sobie funkcje, uprawnienia i kopie zapasowe, które są potrzebne na końcu zadania.
Język polski: polecenie egzaminacyjne jest tekstem użytkowym. Słowa „tylko”, „każdy”, „co najmniej” i „posortuj” zmieniają wynik. Warto podkreślić je przed pisaniem SQL, bo jeden pominięty warunek potrafi przekreślić poprawną składniowo odpowiedź.
Otrzymujesz plik CSV z 30 książkami. W trakcie kontroli zauważasz trzy problemy: jeden ISBN powtarza się drugi raz, jedna data wydania ma format 15.09.2026, a jedna książka ma kategorię 99, której nie ma w tabeli kategorie. Opisz kolejność działań od otwarcia pliku do eksportu końcowego. Wskaż, w którym momencie poprawisz każdy błąd, jak sprawdzisz, że import się udał, i dlaczego nie należy najpierw importować, a potem „jakoś naprawiać” dane.
Pokaż przykładowe rozwiązanie i kryteria
Przykład: najpierw otwieram plik w edytorze tekstu lub arkuszu i sprawdzam nagłówki, separator oraz kodowanie. Duplikat ISBN poprawiam, nadając nowy numer lub usuwając powtórzony wiersz. Datę zamieniam na 2026-09-15, a kategorię 99 zamieniam na istniejący identyfikator lub dopisuję brakującą kategorię do słownika przed importem. Importuję do tabeli ksiazki, sprawdzam COUNT(*) i kilka wierszy, a następnie wykonuję raport i eksport. Importowanie błędnych danych od razu jest złe, bo baza odrzuci część wierszy albo zapisze je w niespójnym stanie, a poprawianie po fakcie wymaga dodatkowych zapytań i zwiększa ryzyko pomyłki.
Kryteria: (1) diagnoza — uczeń nazywa wszystkie trzy błędy i ich skutki; (2) kolejność — poprawia dane przed importem, a nie po nim; (3) spójność — dba o klucz obcy kategorii i unikalność ISBN; (4) weryfikacja — po imporcie sprawdza liczbę wierszy, wybrane rekordy i gotowość pliku do eksportu.
Ćwiczenia SQL
Zadania do samodzielnego wykonania w edytorze SQL.
- 1Raport kategorii na egzaminPrzygotuj raport kategorii z liczbą książek, dostępnymi egzemplarzami, średnią ceną i sumą stanów.Zadanie i podpowiedzi →
- 2Kopia drogich książekUtwórz tabelę ksiazki_kopia i przenieś do niej książki o cenie co najmniej 50 zł.Zadanie i podpowiedzi →
- 3Zamknięcie przeterminowanych wypożyczeńZaktualizuj przeterminowane wypożyczenia z terminem przed 18 września 2026 i oblicz karę.Zadanie i podpowiedzi →
- 4Raport kar według klasPrzygotuj raport liczby wypożyczeń, sumy i średniej kar dla każdej klasy.Zadanie i podpowiedzi →