Gotowe ćwiczenia z zapytaniami SQL do uruchomienia w phpMyAdmin. Jedna baza danych — kompletny zestaw poleceń od SELECT po DELETE.
szkola
-- Wklej do phpMyAdmin → zakładka SQL CREATE DATABASE szkola CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci; USE szkola; CREATE TABLE przedmioty ( id_przedm INT AUTO_INCREMENT PRIMARY KEY, nazwa VARCHAR(80) NOT NULL, nauczyciel VARCHAR(80), sala VARCHAR(10) ); CREATE TABLE uczniowie ( id_ucznia INT AUTO_INCREMENT PRIMARY KEY, imie VARCHAR(50) NOT NULL, nazwisko VARCHAR(80) NOT NULL, klasa VARCHAR(10), email VARCHAR(100) UNIQUE, data_ur DATE, id_klasy INT ); CREATE TABLE oceny ( id_oceny INT AUTO_INCREMENT PRIMARY KEY, id_ucznia INT NOT NULL, id_przedm INT NOT NULL, ocena TINYINT CHECK(ocena BETWEEN 1 AND 6), data_wystawienia DATE DEFAULT (CURDATE()), komentarz TEXT, FOREIGN KEY(id_ucznia) REFERENCES uczniowie(id_ucznia), FOREIGN KEY(id_przedm) REFERENCES przedmioty(id_przedm) );
INSERT INTO przedmioty (nazwa, nauczyciel, sala) VALUES ('Matematyka', 'Tomasz Krol', '101'), ('Informatyka', 'Anna Wiśniewska', 'lab1'), ('Język polski', 'Ewa Kowalczyk', '203'), ('Język angielski', 'Marek Nowak', '105'), ('Fizyka', 'Piotr Zając', 'lab2'), ('Historia', 'Zofia Dąbrowska', '302'); INSERT INTO uczniowie (imie, nazwisko, klasa, email, data_ur) VALUES ('Adam', 'Nowak', '3TI', 'a.nowak@szkola.pl', '2007-03-12'), ('Marta', 'Kowalska', '3TI', 'm.kowalska@szkola.pl', '2007-07-24'), ('Piotr', 'Wiśniewski', '3TI', 'p.wisn@szkola.pl', '2006-11-05'), ('Karolina', 'Wójcik', '4TI', 'k.wojcik@szkola.pl', '2006-02-18'), ('Tomasz', 'Lewandowski', '4TI', 't.lew@szkola.pl', '2006-08-30'), ('Alicja', 'Szymańska', '4TI', 'a.szym@szkola.pl', '2007-01-09'), ('Bartosz', 'Zieliński', '3TI', 'b.ziel@szkola.pl', '2007-06-14'), ('Natalia', 'Dąbrowska', '4TI', 'n.dab@szkola.pl', '2006-05-22'); INSERT INTO oceny (id_ucznia, id_przedm, ocena, data_wystawienia) VALUES (1,1,5,'2024-09-15'),(1,2,6,'2024-09-20'),(1,3,4,'2024-10-01'), (2,1,4,'2024-09-15'),(2,2,5,'2024-09-20'),(2,4,6,'2024-10-05'), (3,1,3,'2024-09-15'),(3,5,2,'2024-10-10'),(3,6,4,'2024-10-12'), (4,2,6,'2024-09-18'),(4,1,5,'2024-10-02'),(4,3,5,'2024-10-08'), (5,1,2,'2024-09-15'),(5,4,3,'2024-10-05'),(5,5,4,'2024-10-10'), (6,2,5,'2024-09-18'),(6,3,6,'2024-10-08'),(6,6,5,'2024-10-12'), (7,1,4,'2024-09-15'),(7,2,4,'2024-09-20'),(7,4,5,'2024-10-05'), (8,1,6,'2024-09-15'),(8,5,5,'2024-10-10'),(8,6,3,'2024-10-12');
Wyświetl imię, nazwisko i klasę wszystkich uczniów. Posortuj wyniki alfabetycznie po nazwisku.
SELECT imie, nazwisko, klasa FROM uczniowie ORDER BY nazwisko ASC;
| imie | nazwisko | klasa |
|---|---|---|
| Natalia | Dąbrowska | 4TI |
| Marta | Kowalska | 3TI |
| Tomasz | Lewandowski | 4TI |
| … (8 wierszy łącznie) | ||
Wyświetl tylko uczniów z klasy 3TI. Pokaż imię, nazwisko i email.
SELECT imie, nazwisko, email FROM uczniowie WHERE klasa = '3TI' ORDER BY nazwisko;
| imie | nazwisko | |
|---|---|---|
| Marta | Kowalska | m.kowalska@szkola.pl |
| Adam | Nowak | a.nowak@szkola.pl |
| Piotr | Wiśniewski | p.wisn@szkola.pl |
| Bartosz | Zieliński | b.ziel@szkola.pl |
Wyświetl wszystkie oceny, które są 5 lub 6. Pokaż id ucznia, id przedmiotu, ocenę i datę wystawienia.
SELECT id_ucznia, id_przedm, ocena, data_wystawienia FROM oceny WHERE ocena IN (5, 6) ORDER BY ocena DESC, data_wystawienia;
WHERE ocena >= 5 — oba zapisy dają ten sam wynik. Operator IN (5,6) jest czytelniejszy gdy masz konkretną listę wartości.Znajdź wszystkich uczniów, których nazwisko kończy się na „ski". Użyj operatora LIKE.
SELECT imie, nazwisko, klasa FROM uczniowie WHERE nazwisko LIKE '%ski';
| imie | nazwisko | klasa |
|---|---|---|
| Marta | Kowalska | 3TI |
| Piotr | Wiśniewski | 3TI |
| Tomasz | Lewandowski | 4TI |
% zastępuje dowolny ciąg znaków. '%ski' = kończy się na „ski". 'A%' = zaczyna się na „A". '%an%' = zawiera „an" gdziekolwiek.Policz ilu uczniów jest w każdej klasie. Użyj GROUP BY i COUNT.
SELECT klasa, COUNT(*) AS liczba_uczniow FROM uczniowie GROUP BY klasa ORDER BY klasa;
| klasa | liczba_uczniow |
|---|---|
| 3TI | 4 |
| 4TI | 4 |
Oblicz średnią ocenę z matematyki (id_przedm = 1). Zaokrąglij do 2 miejsc po przecinku.
SELECT ROUND(AVG(ocena), 2) AS srednia FROM oceny WHERE id_przedm = 1;
| srednia |
|---|
| 4.25 |
Wyświetl oceny ucznia o id=1: jego imię, nazwisko, nazwę przedmiotu i ocenę. Użyj INNER JOIN.
SELECT u.imie, u.nazwisko, p.nazwa AS przedmiot, o.ocena FROM oceny o INNER JOIN uczniowie u ON o.id_ucznia = u.id_ucznia INNER JOIN przedmioty p ON o.id_przedm = p.id_przedm WHERE o.id_ucznia = 1 ORDER BY o.ocena DESC;
| imie | nazwisko | przedmiot | ocena |
|---|---|---|---|
| Adam | Nowak | Informatyka | 6 |
| Adam | Nowak | Matematyka | 5 |
| Adam | Nowak | Język polski | 4 |
Dla każdego ucznia oblicz średnią wszystkich ocen. Wyświetl tylko tych, u których średnia przekracza 4. Pokaż imię i nazwisko.
SELECT u.imie, u.nazwisko, ROUND(AVG(o.ocena), 2) AS srednia FROM oceny o INNER JOIN uczniowie u ON o.id_ucznia = u.id_ucznia GROUP BY u.id_ucznia, u.imie, u.nazwisko HAVING AVG(o.ocena) > 4 ORDER BY srednia DESC;
| imie | nazwisko | srednia |
|---|---|---|
| Marta | Kowalska | 5.00 |
| Alicja | Szymańska | 5.33 |
| Natalia | Dąbrowska | 4.67 |
Dla każdego przedmiotu wyświetl najwyższą, najniższą i średnią ocenę wraz z nazwą przedmiotu.
SELECT p.nazwa, MAX(o.ocena) AS najlepsza, MIN(o.ocena) AS najgorsza, ROUND(AVG(o.ocena), 2) AS srednia FROM oceny o INNER JOIN przedmioty p ON o.id_przedm = p.id_przedm GROUP BY p.id_przedm, p.nazwa ORDER BY srednia DESC;
Wyświetl wszystkie oceny wystawione w październiku 2024. Użyj operatora BETWEEN z datami.
SELECT id_ucznia, id_przedm, ocena, data_wystawienia FROM oceny WHERE data_wystawienia BETWEEN '2024-10-01' AND '2024-10-31' ORDER BY data_wystawienia;
WHERE data_wystawienia >= '2024-10-01' AND data_wystawienia <= '2024-10-31'. Możesz też użyć funkcji MONTH(data_wystawienia) = 10.Znajdź uczniów, którzy nie mają jeszcze żadnej oceny. Użyj podzapytania z NOT IN.
SELECT imie, nazwisko, klasa FROM uczniowie WHERE id_ucznia NOT IN ( SELECT DISTINCT id_ucznia FROM oceny );
FROM uczniowie u LEFT JOIN oceny o ON u.id_ucznia=o.id_ucznia WHERE o.id_oceny IS NULL.Wyświetl pełną listę uczniów. Połącz imię i nazwisko w jedną kolumnę „pełne_imię". Pokaż też klasę i email.
SELECT CONCAT(imie, ' ', nazwisko) AS pelne_imie, klasa, email FROM uczniowie ORDER BY nazwisko;
| pelne_imie | klasa | |
|---|---|---|
| Natalia Dąbrowska | 4TI | n.dab@szkola.pl |
| Marta Kowalska | 3TI | m.kowalska@szkola.pl |
| … (8 wierszy) | ||
Dodaj do tabeli uczniowie nowego ucznia: Marek Jabłoński, klasa 4TI, email: m.jab@szkola.pl, data urodzenia: 2006-09-03.
INSERT INTO uczniowie (imie, nazwisko, klasa, email, data_ur) VALUES ('Marek', 'Jabłoński', '4TI', 'm.jab@szkola.pl', '2006-09-03'); -- Sprawdzenie: SELECT * FROM uczniowie WHERE nazwisko = 'Jabłoński';
Dodaj trzy oceny dla ucznia Marka Jabłońskiego (id=9, jeśli był dodany jako ostatni): Informatyka-5, Matematyka-4, Fizyka-3.
INSERT INTO oceny (id_ucznia, id_przedm, ocena) VALUES (9, 2, 5), -- Informatyka (9, 1, 4), -- Matematyka (9, 5, 3); -- Fizyka -- Sprawdzenie nowych ocen: SELECT o.ocena, p.nazwa FROM oceny o INNER JOIN przedmioty p ON o.id_przedm = p.id_przedm WHERE o.id_ucznia = 9;
Dodaj do tabeli przedmioty nowy przedmiot: Bazy danych, nauczyciel: Anna Wiśniewska, sala: lab1.
INSERT INTO przedmioty (nazwa, nauczyciel, sala) VALUES ('Bazy danych', 'Anna Wiśniewska', 'lab1'); -- Sprawdź jaki ID dostał nowy przedmiot: SELECT LAST_INSERT_ID() AS nowe_id;
LAST_INSERT_ID() zwraca ID ostatnio wstawionego rekordu. Jest przydatne gdy chcesz od razu użyć nowego ID np. do wstawienia powiązanych ocen dla nowego przedmiotu.Dodaj ocenę 5 z Informatyki dla wszystkich uczniów klasy 3TI, którzy jeszcze nie mają oceny z tego przedmiotu.
INSERT INTO oceny (id_ucznia, id_przedm, ocena) SELECT u.id_ucznia, 2, 5 FROM uczniowie u WHERE u.klasa = '3TI' AND u.id_ucznia NOT IN ( SELECT id_ucznia FROM oceny WHERE id_przedm = 2 );
Uczeń Adam Nowak przeniósł się do klasy 4TI. Zaktualizuj jego klasę w bazie danych.
-- Zawsze sprawdź co zmienisz! SELECT id_ucznia, imie, nazwisko, klasa FROM uczniowie WHERE imie = 'Adam' AND nazwisko = 'Nowak'; -- Aktualizacja: UPDATE uczniowie SET klasa = '4TI' WHERE id_ucznia = 1;
Popraw ocenę ucznia Piotra Wiśniewskiego z Fizyki (id_przedm=5) z 2 na 3. Ustaw też datę na dzisiaj.
UPDATE oceny SET ocena = 3, data_wystawienia = CURDATE() WHERE id_ucznia = 3 -- Piotr Wiśniewski AND id_przedm = 5; -- Fizyka
Laboratorium 2 jest remontowane. Przenieś wszystkie przedmioty z sali lab2 do sali lab3.
UPDATE przedmioty SET sala = 'lab3' WHERE sala = 'lab2'; -- Sprawdź zmiany: SELECT nazwa, nauczyciel, sala FROM przedmioty WHERE sala = 'lab3';
Wszyscy uczniowie klasy 3TI mają poprawkę. Dla uczniów z tej klasy: zamień wszystkie oceny 1 na 2.
UPDATE oceny SET ocena = 2 WHERE ocena = 1 AND id_ucznia IN ( SELECT id_ucznia FROM uczniowie WHERE klasa = '3TI' );
Usuń ocenę niedostateczną (ocena=1) ucznia o id=5 z przedmiotu Matematyka (id=1).
-- Najpierw SELECT, żeby sprawdzić co usuniesz: SELECT * FROM oceny WHERE id_ucznia = 5 AND id_przedm = 1; -- Usunięcie: DELETE FROM oceny WHERE id_ucznia = 5 AND id_przedm = 1;
BEGIN; DELETE ...; -- sprawdź; COMMIT; lub ROLLBACK;.Uczeń Marek Jabłoński (id=9) opuścił szkołę. Usuń go z bazy — najpierw jego oceny, potem rekord ucznia.
-- Krok 1: Usuń oceny (klucz obcy!) DELETE FROM oceny WHERE id_ucznia = 9; -- Krok 2: Usuń ucznia DELETE FROM uczniowie WHERE id_ucznia = 9;
Usuń wszystkie oceny wystawione 15 września 2024 — były błędnie wprowadzone.
-- Sprawdź ile rekordów dotyczy: SELECT COUNT(*) AS do_usuniecia FROM oceny WHERE data_wystawienia = '2024-09-15'; -- Usuń: DELETE FROM oceny WHERE data_wystawienia = '2024-09-15';
Rok szkolny klasy 3TI zakończony. Usuń wszystkie oceny uczniów klasy 3TI — bez wpisywania ręcznie ich ID.
DELETE FROM oceny WHERE id_ucznia IN ( SELECT id_ucznia FROM uczniowie WHERE klasa = '3TI' );
id_ucznia IN (1,3,7,9), podzapytanie samo odnajduje właściwe ID. Zawsze testuj podzapytanie osobno (SELECT ...) zanim wykonasz DELETE.Otwórz XAMPP Control Panel → kliknij Start przy Apache i MySQL. Oba moduły muszą świecić na zielono.
W przeglądarce wpisz localhost/phpmyadmin. Login: root, hasło: puste (domyślnie).
Wybierz bazę szkola → zakładka SQL → wklej zapytanie → Ctrl+Enter.
Ctrl+Enter = wykonajCtrl+A = zaznacz wszystkoF5 = odśwież wyniki