Dane w bazie nie leżą w jednym wielkim arkuszu: są podzielone na tabele i powiązane kluczami. W bibliotece osobno zapisuje się książki, czytelników i wypożyczenia — dzięki temu dane każdej książki wpisuje się raz, a baza potrafi odpowiedzieć na pytania „kto co wypożyczył?” albo „których książek nikt nie bierze?”. Na lekcji uczniowie poznają te pojęcia, oglądają trzy tabele i zadają bazie cztery pytania.
Scenariusz jest przeznaczony na 45 minut dla klasy rozpoczynającej naukę SQL. Nie wymaga znajomości JOIN: pierwsze zapytanie to zwykły SELECT, a pozostałe są podane w rozwiązaniu i omawiane krok po kroku. Kolejne lekcje: SELECT, JOIN i klucze.
Przygotowanie stanowisk
Potrzebna jest baza MySQL 8 lub MariaDB (na przykład w XAMPP) i narzędzie do wykonywania zapytań, np. phpMyAdmin. Utwórz pustą bazę ćwiczeniową i zaimportuj raz plik baza.sql z pakietu. Plik nie usuwa tabel, więc ponowny import zgłosi błąd istniejącej tabeli. Zapytania zapisuj w start.sql; rozwiązania są w rozwiazania.sql.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- wyjaśnić pojęcia: baza danych, tabela, wiersz (rekord), kolumna (pole), klucz główny i obcy;
- wskazać w przykładzie encje (książki, czytelnicy) i związek między nimi (wypożyczenia);
- odczytać zapytanie
SELECT,JOIN,GROUP BYiLEFT JOINi przewidzieć jego wynik; - uzasadnić, dlaczego dane są w kilku tabelach, a nie w jednej.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: lista wypożyczeń w jednym arkuszu |
| 5–15 min | Tabele, klucze i powiązania |
| 15–22 min | Pierwsze zapytania: SELECT i JOIN |
| 22–37 min | Cztery zadania |
| 37–42 min | Porównanie wyników z przewidywaniami |
| 42–45 min | Pytania kontrolne |
Co jest w bazie
Baza danych to uporządkowany zbiór danych, którym zarządza system (np. MySQL, SQLite, PostgreSQL). W bazie relacyjnej dane leżą w tabelach — jak arkusze, w których wiersz (rekord) opisuje jeden obiekt, a kolumna (pole) — jedną jego cechę.
| ksiazki.id | tytul | autor | czytelnicy.id | imie | |
|---|---|---|---|---|---|
| 1 | Kod w praktyce | Nowak | 1 | Anna | |
| 2 | Zielony balkon | Kowal | 2 | Bartek | |
| 3 | Sieć od podstaw | Nowak | 3 | Celina | |
| 4 | Tajemnica mapy | Lis |
Tabela wypozyczenia łączy je: każdy wiersz mówi, kto (czytelnik_id), co (ksiazka_id) i kiedy wypożyczył. W bazie jest pięć takich wierszy: Anna wypożyczyła trzy książki, Bartek — dwie, a Celina żadnej.
Klucze
- Klucz główny (
id) jednoznacznie identyfikuje wiersz tabeli. - Klucz obcy (
czytelnik_id,ksiazka_id) wskazuje wiersz w innej tabeli i pilnuje, aby nie powstało wypożyczenie nieistniejącej książki.
Dlaczego kilka tabel?
W jednym arkuszu z kolumnami „imię, tytuł, autor, data” autor i tytuł powtarzałyby się przy każdym wypożyczeniu, a literówka w jednym miejscu dawałaby dwie „różne” książki. Kilka tabel oznacza, że dane o książce zapisano raz, a wypożyczenia tylko do niej odwołują się numerem. Zapytania pytają o dane z wielu tabel naraz: JOIN łączy wiersze po kluczach, GROUP BY grupuje i liczy, LEFT JOIN zachowuje także wiersze bez dopasowania (książki, których nikt nie wypożyczył).
Zadania
Zadanie 1. SELECT. Wypisz tytuł i autora wszystkich książek, alfabetycznie według tytułu.
Zadanie 2. JOIN. Wypisz imię czytelnika, tytuł książki i datę dla każdego wypożyczenia, według numeru wypożyczenia.
Zadanie 3. GROUP BY. Policz, ile książek wypożyczył każdy czytelnik, który cokolwiek wypożyczył — od największej liczby.
Zadanie 4. LEFT JOIN. Wypisz tytuły książek, których nikt nie wypożyczył.
Dla chętnych: dodaj czytelniczkę Celina do wyniku zadania 3 z liczbą 0 (wskazówka: odwróć kolejność tabel i użyj LEFT JOIN).
Rozwiązanie i wyniki
-- Zadanie 1
SELECT tytul, autor
FROM ksiazki
ORDER BY tytul;
-- Zadanie 2
SELECT c.imie, k.tytul, w.data_wypozyczenia
FROM wypozyczenia w
JOIN czytelnicy c ON w.czytelnik_id = c.id
JOIN ksiazki k ON w.ksiazka_id = k.id
ORDER BY w.id;
-- Zadanie 3
SELECT c.imie, COUNT(*) AS ile
FROM wypozyczenia w
JOIN czytelnicy c ON w.czytelnik_id = c.id
GROUP BY c.id, c.imie
ORDER BY ile DESC, c.imie;
-- Zadanie 4
SELECT k.tytul
FROM ksiazki k
LEFT JOIN wypozyczenia w ON w.ksiazka_id = k.id
WHERE w.id IS NULL;
Wyniki (sprawdzone na SQLite z tymi samymi tabelami):
Zadanie 1 — cztery książki w kolejności alfabetycznej (SQLite porządkuje bajtami, więc kolejność polskich liter w innych bazach może się różnić):
| tytul | autor |
|---|---|
| Kod w praktyce | Nowak |
| Siec od podstaw | Nowak |
| Tajemnica mapy | Lis |
| Zielony balkon | Kowal |
Zadanie 2 — pięć wypożyczeń:
| imie | tytul | data |
|---|---|---|
| Anna | Kod w praktyce | 2027-01-10 |
| Anna | Siec od podstaw | 2027-01-12 |
| Bartek | Kod w praktyce | 2027-01-15 |
| Bartek | Zielony balkon | 2027-01-20 |
| Anna | Zielony balkon | 2027-02-01 |
Zadanie 3 — dwóch czytelników (Celina nie wypożyczyła niczego, więc nie występuje w wyniku):
| imie | ile |
|---|---|
| Anna | 3 |
| Bartek | 2 |
Zadanie 4 — jedna książka: Tajemnica mapy.
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
| Zapytanie zwraca iloczyn wszystkich wierszy | Brak warunku ON w JOIN. |
| Celina nie pojawia się w liczbie wypożyczeń | Zwykły JOIN pomija wiersze bez dopasowania; do ich zachowania służy LEFT JOIN. |
| Błąd „Unknown column” | Kolumna należy do innej tabeli albo brakuje aliasu przed nazwą. |
| Dane książki wpisane przy każdym wypożyczeniu | To projekt w jednej tabeli — użyj osobnej tabeli ksiazki i klucza obcego. |
| Błąd klucza obcego przy dodawaniu wypożyczenia | Czytelnik lub książka o podanym id nie istnieje. |
| Różna kolejność wyników w różnych systemach | Bez ORDER BY kolejność nie jest gwarantowana, a sposób porównywania polskich liter zależy od ustawień bazy. |
Pytania kontrolne i punktacja
- Czym różni się klucz główny od klucza obcego?
- Po co baza ma kilka tabel zamiast jednej?
- Dlaczego w zadaniu 3 nie ma Celiny?
Odpowiedzi: Klucz główny identyfikuje wiersz w swojej tabeli, klucz obcy wskazuje wiersz w innej. Aby dane zapisać raz, uniknąć powtórzeń i błędów oraz łączyć je zapytaniami. Bo nie ma żadnego jej wypożyczenia, a zwykły JOIN pokazuje tylko czytelników z dopasowanymi wierszami.
Proponowana punktacja (razem 10 punktów): zadanie 1 — SELECT z ORDER BY 2 pkt; zadanie 2 — dwa JOIN z ON 3 pkt; zadanie 3 — GROUP BY z COUNT 2 pkt; zadanie 4 — LEFT JOIN z IS NULL 2 pkt; wyjaśnienie pojęć klucza 1 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następne kroki to filtrowanie (WHERE), sortowanie i projektowanie własnych tabel. Ten materiał otwiera dział o bazach danych w kursie SQL w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: relacyjne bazy danych w Wikipedii oraz wprowadzenie do SQL w dokumentacji MySQL. Zobacz też lekcję o kluczach.
Poprowadź kolejne lekcje SQL
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu SQL →