Część matury z informatyki poświęcona bazom danych to dla wielu uczniów prawdziwy dar losu. Dlaczego? Ponieważ jest niesamowicie schematyczna. W przeciwieństwie do otwartych problemów algorytmicznych, zadania z SQL prawie zawsze polegają na tych samych kilku wzorcach. Wystarczy, że opanujesz trzy kluczowe koncepcje - łączenie tabel (`JOIN`), grupowanie wyników (`GROUP BY`) i zliczanie (`COUNT`) - a będziesz w stanie rozwiązać niemal każde polecenie, które CKE postawi na Twojej drodze. Ten poradnik to czysta praktyka - przejdziemy przez te filary na prostym, życiowym przykładzie.
Nasza Przykładowa Baza Danych (Szkolna Biblioteka)
Wyobraź sobie, że dostajesz bazę danych biblioteki składającą się z trzech tabel. Zanim napiszesz choć jedną kwerendę, musisz zrozumieć relacje między nimi.
1. Tabela `Czytelnicy` (Przechowuje, kto wypożycza)
| ID_Czytelnika (Klucz Podst.) | Imie | Nazwisko | ID_Klasy (Klucz Obcy) |
|---|---|---|---|
| 1 | Jan | Kowalski | 10 |
| 2 | Anna | Nowak | 11 |
| 3 | Piotr | Zieliński | 10 |
2. Tabela `Klasy` (Słownik klas)
| ID_Klasy (Klucz Podst.) | NazwaKlasy | Wychowawca |
|---|---|---|
| 10 | 3A | mgr Iksiński |
| 11 | 3B | mgr Ygrekowski |
3. Tabela `Wypozyczenia` (Rejestr operacji)
| ID_Wypozyczenia | ID_Czytelnika (Klucz Obcy) | TytulKsiazki | DataWypozyczenia |
|---|---|---|---|
| 1 | 2 | Potop | 2025-01-10 |
| 2 | 1 | Lalka | 2025-01-11 |
| 3 | 2 | Dziady | 2025-01-12 |
| 4 | 3 | Potop | 2025-01-13 |
Kluczowa obserwacja (Relacje): Aby dowiedzieć się, z jakiej klasy jest czytelnik Jan Kowalski, musisz połączyć tabelę `Czytelnicy` (gdzie `ID_Klasy` = 10) z tabelą `Klasy` (gdzie `ID_Klasy` = 10). Aby zobaczyć, co wypożyczyła Anna Nowak, łączysz `Czytelnicy` (gdzie `ID_Czytelnika` = 2) z `Wypozyczenia` (gdzie `ID_Czytelnika` = 2). To jest fundament.
Filar 1: Podstawy (`SELECT`, `FROM`, `WHERE`)
To jest Twój zestaw startowy. Służy do wyciągania danych z JEDNEJ tabeli.
- `SELECT` - Mówi, które kolumny chcesz zobaczyć (np. `Imie`, `Nazwisko`). `SELECT *` oznacza 'pokaż wszystkie kolumny'.
- `FROM` - Mówi, z której tabeli chcesz czerpać dane (np. `Czytelnicy`).
- `WHERE` - Filtruje wiersze (np. `Imie = 'Anna'`).
Zadanie: *Znajdź imię i nazwisko czytelnika o ID równym 3.*
SELECT Imie, Nazwisko
FROM Czytelnicy
WHERE ID_Czytelnika = 3;Wynik: `Piotr | Zieliński`
Filar 2: `INNER JOIN` (Łączenie tabel)
Używasz go, gdy informacja, której szukasz, jest rozbita na dwie lub więcej tabel. `JOIN` 'skleja' wiersze z różnych tabel na podstawie wspólnej wartości - klucza podstawowego i obcego.
Zadanie: *Wypisz imiona i nazwiska wszystkich czytelników wraz z nazwami ich klas.*
Informacje są w dwóch tabelach: `Czytelnicy` (Imie, Nazwisko) i `Klasy` (NazwaKlasy). Musimy je połączyć.
SELECT T1.Imie, T1.Nazwisko, T2.NazwaKlasy
FROM Czytelnicy AS T1
INNER JOIN Klasy AS T2 ON T1.ID_Klasy = T2.ID_Klasy;Co tu się stało?
- `FROM Czytelnicy AS T1` - Bierzemy tabelę `Czytelnicy` i nadajemy jej 'ksywkę' `T1` (to ułatwia pisanie).
- `INNER JOIN Klasy AS T2` - Doklejamy do niej tabelę `Klasy` jako `T2`.
- `ON T1.ID_Klasy = T2.ID_Klasy` - To jest 'klej'. Mówimy: 'Połącz wiersz z T1 z wierszem z T2 tylko wtedy, gdy `ID_Klasy` w obu jest identyczne'.
Wynik:
| Imie | Nazwisko | NazwaKlasy |
|---|---|---|
| Jan | Kowalski | 3A |
| Anna | Nowak | 3B |
| Piotr | Zieliński | 3A |
Filar 3: `GROUP BY` i Funkcje Agregujące (`COUNT`, `SUM`, `AVG`)
Używasz ich, gdy pytanie w poleceniu zaczyna się od słów: "Ile...", "Policz...", "Znajdź średnią...", "Podsumuj...". `GROUP BY` 'zwija' wiele wierszy w jeden na podstawie wspólnej cechy, a funkcje agregujące (jak `COUNT` - licz, `SUM` - sumuj, `AVG` - średnia) wykonują na nich obliczenia.
Zadanie: *Policz, ilu czytelników jest w każdej klasie.*
SELECT T2.NazwaKlasy, COUNT(T1.ID_Czytelnika) AS LiczbaUczniow
FROM Czytelnicy AS T1
INNER JOIN Klasy AS T2 ON T1.ID_Klasy = T2.ID_Klasy
GROUP BY T2.NazwaKlasy;Co tu się stało?
- Najpierw `JOIN` tworzy wirtualną tabelę (tę, co w poprzednim punkcie).
- Potem `GROUP BY T2.NazwaKlasy` bierze tę tabelę i 'zwija' ją: wszystkie wiersze z '3A' lądują w jednym worku, a wszystkie z '3B' w drugim.
- Na koniec `SELECT` z `COUNT(T1.ID_Czytelnika)` liczy, ile rekordów wpadło do każdego 'worka'.
Wynik:
| NazwaKlasy | LiczbaUczniow |
|---|---|
| 3A | 2 |
| 3B | 1 |
Łączymy Wszystko: `JOIN` + `GROUP BY` + `ORDER BY`
To jest typowe, złożone zadanie maturalne, które wykorzystuje wszystkie poznane elementy oraz `ORDER BY` (sortowanie).
Zadanie: *Policz, ile książek wypożyczył każdy czytelnik. Wypisz imię, nazwisko i liczbę wypożyczonych książek. Posortuj wyniki od najaktywniejszego czytelnika.*
SELECT T1.Imie, T1.Nazwisko, COUNT(T2.ID_Wypozyczenia) AS LiczbaKsiazek
FROM Czytelnicy AS T1
INNER JOIN Wypozyczenia AS T2 ON T1.ID_Czytelnika = T2.ID_Czytelnika
GROUP BY T1.Imie, T1.Nazwisko
ORDER BY LiczbaKsiazek DESC;Analiza:
- `JOIN` łączy `Czytelnicy` (T1) z `Wypozyczenia` (T2) po `ID_Czytelnika`.
- `GROUP BY T1.Imie, T1.Nazwisko` tworzy 'worki' dla każdego unikalnego czytelnika.
- `COUNT(T2.ID_Wypozyczenia)` liczy, ile rekordów wypożyczeń wpadło do 'worka' każdego czytelnika.
- `ORDER BY LiczbaKsiazek DESC` sortuje wynik malejąco (`DESC`).
Wynik:
| Imie | Nazwisko | LiczbaKsiazek |
|---|---|---|
| Anna | Nowak | 2 |
| Jan | Kowalski | 1 |
| Piotr | Zieliński | 1 |
Podsumowanie: Twój Schemat Postępowania
Gdy dostaniesz zadanie z bazy danych, zawsze postępuj według tego planu:
- Przeanalizuj relacje: Zobacz, które tabele mają wspólne klucze (np. `ID_Klasy`).
- Zidentyfikuj pytanie:
- a) Czy pyta o dane z jednej tabeli? -> Użyj `SELECT ... FROM ... WHERE ...`
- b) Czy pyta o dane z wielu tabel (np. nazwisko ucznia i nazwę jego klasy)? -> Musisz użyć `INNER JOIN ... ON ...`
- c) Czy pyta "Ile...", "Średnio...", "Suma..."? -> Musisz użyć `GROUP BY` i funkcji agregujących (`COUNT`, `AVG`, `SUM`).
- Sortowanie: Jeśli wynik ma być posortowany, dodaj `ORDER BY ... [ASC/DESC]` na samym końcu.
Opanuj te wzorce, a zadania z SQL staną się dla Ciebie najprostszą częścią egzaminu.
