Strona główna Bazy danych Podstawy SQL
INF.03 · XAMPP · klasa 3–4

Podstawy SQL
– ćwiczenia

Gotowe ćwiczenia z zapytaniami SQL do uruchomienia w phpMyAdmin. Jedna baza danych — kompletny zestaw poleceń od SELECT po DELETE.

SELECT WHERE ORDER BY JOIN GROUP BY INSERT UPDATE DELETE LIKE COUNT / AVG HAVING
24 Ćwiczenia
3 Tabele
INF.03 Kwalifikacja

Schemat bazy danych

baza: szkola
 szkola — MySQL / MariaDB
📘 uczniowie
id_uczniaINT AIPK
imieVARCHAR(50)
nazwiskoVARCHAR(80)
klasaVARCHAR(10)
emailVARCHAR(100)
data_urDATE
id_klasyINTFK
📗 oceny
id_ocenyINT AIPK
id_uczniaINTFK
id_przedmINTFK
ocenaTINYINT
data_wystawieniaDATE
komentarzTEXT
📙 przedmioty
id_przedmINT AIPK
nazwaVARCHAR(80)
nauczycielVARCHAR(80)
salaVARCHAR(10)
-- 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');

Lista ćwiczeń

24 zadania · kliknij aby rozwinąć
Twój postęp
0 / 24
Filtruj:
SELECT — pobieranie danych 12 ćwiczeń
01
SELECT Wyświetl wszystkich uczniów

Wyświetl imię, nazwisko i klasę wszystkich uczniów. Posortuj wyniki alfabetycznie po nazwisku.

SELECT imie, nazwisko, klasa
FROM   uczniowie
ORDER BY nazwisko ASC;
imienazwiskoklasa
NataliaDąbrowska4TI
MartaKowalska3TI
TomaszLewandowski4TI
… (8 wierszy łącznie)
Wynik: 8 wierszy
02
SELECT Uczniowie klasy 3TI

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;
imienazwiskoemail
MartaKowalskam.kowalska@szkola.pl
AdamNowaka.nowak@szkola.pl
PiotrWiśniewskip.wisn@szkola.pl
BartoszZielińskib.ziel@szkola.pl
Wynik: 4 wiersze
03
SELECT Oceny 5 i 6 (bardzo dobre i celujące)

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;
Możesz też napisać WHERE ocena >= 5 — oba zapisy dają ten sam wynik. Operator IN (5,6) jest czytelniejszy gdy masz konkretną listę wartości.
04
SELECT LIKE — uczniowie z "ski" w nazwisku

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';
imienazwiskoklasa
MartaKowalska3TI
PiotrWiśniewski3TI
TomaszLewandowski4TI
Wynik: 3 wiersze
% zastępuje dowolny ciąg znaków. '%ski' = kończy się na „ski". 'A%' = zaczyna się na „A". '%an%' = zawiera „an" gdziekolwiek.
05
SELECT COUNT — liczba uczniów w każdej klasie

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;
klasaliczba_uczniow
3TI4
4TI4
Wynik: 2 wiersze
06
SELECT AVG — średnia ocena z matematyki

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
Wynik: 1 wiersz
07
SELECT JOIN — oceny z nazwą przedmiotu

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;
imienazwiskoprzedmiotocena
AdamNowakInformatyka6
AdamNowakMatematyka5
AdamNowakJęzyk polski4
Wynik: 3 wiersze
Aliasy tabel (o, u, p) skracają zapis. ON wskazuje które kolumny łączą tabele — zawsze klucz główny = klucz obcy. Przy 3 tabelach potrzebujesz 2 klauzul JOIN.
08
SELECT GROUP BY + HAVING — uczniowie ze średnią > 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;
imienazwiskosrednia
MartaKowalska5.00
AlicjaSzymańska5.33
NataliaDąbrowska4.67
Wynik: kilka wierszy (zależy od danych)
WHERE filtruje pojedyncze wiersze PRZED grupowaniem. HAVING filtruje grupy PO zgrupowaniu. Nigdy nie używaj HAVING do filtrowania zwykłych kolumn — to rola WHERE.
09
SELECT MAX, MIN — najlepsza i najgorsza ocena

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;
10
SELECT BETWEEN — oceny wystawione w październiku

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;
BETWEEN jest włączający z obu stron (≥ i ≤). Alternatywnie: WHERE data_wystawienia >= '2024-10-01' AND data_wystawienia <= '2024-10-31'. Możesz też użyć funkcji MONTH(data_wystawienia) = 10.
11
SELECT Podzapytanie (subquery) — uczniowie bez ocen

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
);
Podzapytanie (subquery) wykonuje się WEWNĄTRZ głównego zapytania. Można to też rozwiązać przez LEFT JOIN: FROM uczniowie u LEFT JOIN oceny o ON u.id_ucznia=o.id_ucznia WHERE o.id_oceny IS NULL.
12
SELECT CONCAT + FORMAT — lista z pełnymi danymi

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_imieklasaemail
Natalia Dąbrowska4TIn.dab@szkola.pl
Marta Kowalska3TIm.kowalska@szkola.pl
… (8 wierszy)
Wynik: 8 wierszy
INSERT — dodawanie rekordów 4 ćwiczenia
13
INSERT Dodaj nowego ucznia

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';
Kolejność kolumn w INSERT musi odpowiadać kolejności wartości w VALUES. Kolumny z AUTO_INCREMENT (id_ucznia) pomijamy — MySQL nada wartość automatycznie. DEFAULT i nullable kolumny też można pominąć.
14
INSERT Dodaj kilka ocen jednym zapytaniem

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;
15
INSERT Dodaj nowy przedmiot

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.
16
INSERT INSERT z podzapytaniem

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
  );
INSERT INTO ... SELECT pozwala wstawić wiele wierszy generowanych przez SELECT. Nie używasz wtedy VALUES — dane pochodzą bezpośrednio z podzapytania. Bardzo użyteczne przy kopiowaniu lub generowaniu danych.
UPDATE — modyfikacja rekordów 4 ćwiczenia
17
UPDATE Zmień klasę ucznia

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;
⚠️ Zawsze używaj WHERE przy UPDATE! Bez niego zmienisz klasę WSZYSTKICH uczniów. Dobrą praktyką jest najpierw wykonać SELECT z tym samym WHERE — żeby zobaczyć co zostanie zmienione.
18
UPDATE Popraw ocenę

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
19
UPDATE Zmień salę dla wszystkich przedmiotów prowadzonych w lab2

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';
20
UPDATE UPDATE z podzapytaniem — podnieś oceny niedostateczne

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'
  );
UPDATE z podzapytaniem pozwala aktualizować rekordy na podstawie wartości z innej tabeli. Uwaga: MySQL nie pozwala modyfikować tej samej tabeli, której używasz w podzapytaniu — tu to nie problem, bo aktualizujemy oceny na podstawie uczniowie.
DELETE — usuwanie rekordów 4 ćwiczenia
21
DELETE Usuń ocenę niedostateczną

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;
⚠️ DELETE bez WHERE usuwa WSZYSTKIE rekordy z tabeli! Zawsze sprawdzaj najpierw SELECT-em. Jeśli chcesz cofnąć omyłkowe DELETE, użyj transakcji: BEGIN; DELETE ...; -- sprawdź; COMMIT; lub ROLLBACK;.
22
DELETE Usuń ucznia (i jego oceny)

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;
Tabela oceny ma FOREIGN KEY wskazujący na uczniowie. Jeśli spróbujesz usunąć ucznia, który ma oceny, MySQL zwróci błąd: "Cannot delete a parent row — a foreign key constraint fails". Najpierw usuń rekordy z tabeli podrzędnej (oceny), potem z nadrzędnej (uczniowie).
23
DELETE Usuń wszystkie oceny z danej daty

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';
24
DELETE DELETE z podzapytaniem — usuń oceny uczniów klasy 3TI

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'
);
DELETE z podzapytaniem to potężne narzędzie. Zamiast pisać id_ucznia IN (1,3,7,9), podzapytanie samo odnajduje właściwe ID. Zawsze testuj podzapytanie osobno (SELECT ...) zanim wykonasz DELETE.

Jak zacząć — XAMPP + phpMyAdmin

konfiguracja środowiska
01

Uruchom XAMPP

Otwórz XAMPP Control Panel → kliknij Start przy Apache i MySQL. Oba moduły muszą świecić na zielono.

02

Otwórz phpMyAdmin

W przeglądarce wpisz localhost/phpmyadmin. Login: root, hasło: puste (domyślnie).

03

Wykonaj SQL

Wybierz bazę szkola → zakładka SQL → wklej zapytanie → Ctrl+Enter.

04

Skróty klawiszowe

Ctrl+Enter = wykonaj
Ctrl+A = zaznacz wszystko
F5 = odśwież wyniki