Ćwiczenia SQL dla uczniów

Spis treści

Ć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';