Ćwiczenia SQL dla uczniów
Ćwiczenie 1: Tworzenie tabeli i wstawianie danych
CREATE DATABASE szkola;
USE szkola;
CREATE TABLE uczniowie (
id INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50),
nazwisko VARCHAR(50),
wiek INT,
klasa VARCHAR(10)
);
INSERT INTO uczniowie (imie, nazwisko, wiek, klasa) VALUES
('Jan', 'Kowalski', 16, '2A'),
('Anna', 'Nowak', 17, '3B'),
('Piotr', 'Wiśniewski', 15, '1C'),
('Maria', 'Lewandowska', 18, '4D'),
('Tomasz', 'Zieliński', 16, '2A');
Ćwiczenie 2: Aktualizacja danych w tabeli
UPDATE uczniowie SET wiek = 16 WHERE id = 3;
UPDATE uczniowie SET klasa = '3A' WHERE klasa = '2A';
Ćwiczenie 3: Usuwanie danych
DELETE FROM uczniowie WHERE id = 4;
DELETE FROM uczniowie WHERE klasa = '3B';
Ćwiczenie 4: Pobieranie danych
SELECT * FROM uczniowie WHERE klasa = '3A';
SELECT * FROM uczniowie WHERE wiek > 16;
SELECT * FROM uczniowie WHERE imie LIKE 'A%';
Ćwiczenie 5: Tworzenie relacji między tabelami
CREATE TABLE nauczyciele (
id INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50),
nazwisko VARCHAR(50)
);
CREATE TABLE przedmioty (
id INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100),
nauczyciel_id INT,
FOREIGN KEY (nauczyciel_id) REFERENCES nauczyciele(id)
);
Ćwiczenie 6: Pobieranie danych z połączonych tabel
SELECT przedmioty.nazwa, nauczyciele.imie, nauczyciele.nazwisko
FROM przedmioty
INNER JOIN nauczyciele ON przedmioty.nauczyciel_id = nauczyciele.id;
Ćwiczenie 7: Liczenie rekordów i grupowanie
SELECT klasa, COUNT(*) AS liczba_uczniow
FROM uczniowie
GROUP BY klasa;
Ćwiczenie 8: Użycie podzapytania
SELECT * FROM uczniowie WHERE wiek = (SELECT MAX(wiek) FROM uczniowie);
Ćwiczenie 9: Tworzenie indeksów
CREATE INDEX idx_nazwisko ON uczniowie(nazwisko);
Ćwiczenie 10: Tworzenie widoków
CREATE VIEW uczniowie_widok AS
SELECT imie, nazwisko, klasa FROM uczniowie WHERE wiek > 16;
Ćwiczenie 11: Wyrażenia CASE
SELECT imie, nazwisko,
CASE
WHEN wiek < 16 THEN 'Młodszy'
WHEN wiek BETWEEN 16 AND 17 THEN 'Średni'
ELSE 'Starszy'
END AS kategoria_wiekowa
FROM uczniowie;
Ćwiczenie 12: Zapytania z UNION
SELECT imie, nazwisko FROM uczniowie WHERE klasa = '3A'
UNION
SELECT imie, nazwisko FROM nauczyciele;
Ćwiczenie 13: Funkcje agregujące
SELECT AVG(wiek) AS sredni_wiek, MIN(wiek) AS najmniejszy_wiek, MAX(wiek) AS najstarszy
FROM uczniowie;
Ćwiczenie 14: Grupowanie i HAVING
SELECT klasa, COUNT(*) AS liczba_uczniow
FROM uczniowie
GROUP BY klasa
HAVING COUNT(*) > 2;
Ćwiczenie 15: Tworzenie tabeli tymczasowej
CREATE TEMPORARY TABLE tymczasowa_uczniowie AS
SELECT * FROM uczniowie WHERE wiek > 16;
Ćwiczenie 16: Transakcje
START TRANSACTION;
UPDATE uczniowie SET wiek = wiek + 1 WHERE klasa = '3A';
ROLLBACK;
Ćwiczenie 17: Zastosowanie funkcji tekstowych
SELECT UPPER(imie) AS wielkie_litery, LENGTH(nazwisko) AS dlugosc_nazwiska FROM uczniowie;
Ćwiczenie 18: Zastosowanie funkcji daty i czasu
SELECT NOW() AS aktualna_data, YEAR(CURDATE()) AS obecny_rok;
Ćwiczenie 19: Zagnieżdżone zapytania
SELECT * FROM uczniowie WHERE wiek = (SELECT MAX(wiek) FROM uczniowie);
Ćwiczenie 20: Usuwanie duplikatów
DELETE FROM uczniowie WHERE id NOT IN (SELECT MIN(id) FROM uczniowie GROUP BY imie, nazwisko, wiek, klasa);
Ćwiczenie 21: Tworzenie procedury składowanej
DELIMITER //
CREATE PROCEDURE DodajUcznia(IN imie VARCHAR(50), IN nazwisko VARCHAR(50), IN wiek INT, IN klasa VARCHAR(10))
BEGIN
INSERT INTO uczniowie (imie, nazwisko, wiek, klasa) VALUES (imie, nazwisko, wiek, klasa);
END //
DELIMITER ;
Ćwiczenie 22: Tworzenie funkcji użytkownika
DELIMITER //
CREATE FUNCTION ObliczSredniWiek() RETURNS DECIMAL(5,2)
BEGIN
DECLARE wynik DECIMAL(5,2);
SELECT AVG(wiek) INTO wynik FROM uczniowie;
RETURN wynik;
END //
DELIMITER ;
Ćwiczenie 23: Wyzwalacze (triggers)
CREATE TRIGGER przed_usunieciem_ucznia
BEFORE DELETE ON uczniowie
FOR EACH ROW
BEGIN
INSERT INTO logi (akcja, opis) VALUES ('DELETE', CONCAT('Usunięto ucznia: ', OLD.imie, ' ', OLD.nazwisko));
END;
Ćwiczenie 24: Tworzenie tabeli z kluczem obcym
CREATE TABLE oceny (
id INT AUTO_INCREMENT PRIMARY KEY,
uczniowie_id INT,
przedmiot VARCHAR(50),
ocena INT,
FOREIGN KEY (uczniowie_id) REFERENCES uczniowie(id)
);
Ćwiczenie 25: Pobieranie danych z kilku tabel (JOIN)
SELECT uczniowie.imie, uczniowie.nazwisko, oceny.przedmiot, oceny.ocena
FROM uczniowie
INNER JOIN oceny ON uczniowie.id = oceny.uczniowie_id;
Ćwiczenie 26: Sortowanie danych
SELECT * FROM uczniowie ORDER BY nazwisko ASC;
Ćwiczenie 27: Ograniczenie liczby wyników
SELECT * FROM uczniowie LIMIT 5;
Ćwiczenie 28: Sprawdzanie warunków w zapytaniach
SELECT * FROM uczniowie WHERE wiek > 16 AND klasa = '3A';