Dział IV. Stosowanie Strukturalnego Języka Zapytań SQL: Technik Informatyk (Klasa 4)

Środowisko pracy: XAMPP (MariaDB/MySQL) + phpMyAdmin

Baza danych: e_sklep (Sklep internetowy)

💾 Inicjalizacja bazy danych i struktura

Instrukcja dla ucznia: Zanim zaczniemy pracę, utwórz bazę danych i wypełnij ją początkowymi danymi. Poniższy skrypt tworzy wszystkie wymagane tabele (Klienci, Produkty, Zamowienia, Szczegoly_Zamowienia) oraz wstawia przykładowe rekordy. Wklej ten kod w całości do zakładki SQL w phpMyAdmin i uruchom.

📜 Pełny skrypt inicjujący (e_sklep.sql)

 INICJALIZACJA I TWORZENIE BAZY DANYCH

 CZYŚCZENIE (Zapewnienie czystego startu)
DROP TABLE IF EXISTS Szczegoly_Zamowienia;
DROP TABLE IF EXISTS Zamowienia;
DROP TABLE IF EXISTS Produkty;
DROP TABLE IF EXISTS Klienci;
DROP TABLE IF EXISTS Logi_Cen;   Dodamy później, aby nie usuwać ćwiczeń
DROP TABLE IF EXISTS Kategorie;

 1. Tabela Klienci
CREATE TABLE Klienci (
    KlientID INT PRIMARY KEY AUTO_INCREMENT,
    Nazwisko VARCHAR(50) NOT NULL,
    AdresEmail VARCHAR(100) NOT NULL UNIQUE, 
    DataRejestracji DATE DEFAULT (CURRENT_DATE)
);

 2. Tabela Produkty
CREATE TABLE Produkty (
    ProduktID INT PRIMARY KEY AUTO_INCREMENT,
    Nazwa VARCHAR(100) NOT NULL UNIQUE,
    Cena DECIMAL(8, 2) NOT NULL,
    CHECK (Cena > 0),
    IloscMagazyn INT NOT NULL DEFAULT 0,
    Opis TEXT
);

 3. Tabela Zamowienia (FOREIGN KEY)
CREATE TABLE Zamowienia (
    ZamowienieID INT PRIMARY KEY AUTO_INCREMENT,
    KlientID INT NOT NULL,
    DataZamowienia DATETIME DEFAULT CURRENT_TIMESTAMP,
    Status ENUM('Nowe', 'Wysłane', 'Anulowane') DEFAULT 'Nowe',
    FOREIGN KEY (KlientID) REFERENCES Klienci(KlientID)
);

 4. Tabela Szczegoly_Zamowienia (MULTIPLE FOREIGN KEYS)
CREATE TABLE Szczegoly_Zamowienia (
    SzczegolyID INT PRIMARY KEY AUTO_INCREMENT,
    ZamowienieID INT NOT NULL,
    ProduktID INT NOT NULL,
    Ilosc INT NOT NULL,
    CenaJednostkowa DECIMAL(8, 2) NOT NULL,
    FOREIGN KEY (ZamowienieID) REFERENCES Zamowienia(ZamowienieID),
    FOREIGN KEY (ProduktID) REFERENCES Produkty(ProduktID)
);

 DML: WSTAWIANIE DANYCH TESTOWYCH
INSERT INTO Klienci (Nazwisko, AdresEmail) VALUES
('Kowalski', 'jan.kowalski@poczta.pl'),
('Nowak', 'anna.nowak@poczta.pl'),
('Wiśniewski', 'michal.wisniewski@poczta.pl');

INSERT INTO Produkty (Nazwa, Cena, IloscMagazyn) VALUES
('Laptop Gamingowy', 4500.00, 10),
('Monitor 27 cali', 999.99, 50),
('Klawiatura Mechaniczna', 350.50, 25),
('Mysz Bezprzewodowa', 150.00, 40),
('Słuchawki BT', 499.00, 100);

INSERT INTO Zamowienia (KlientID, Status) VALUES
(1, 'Wysłane'),
(2, 'Nowe'),
(1, 'Nowe');

INSERT INTO Szczegoly_Zamowienia (ZamowienieID, ProduktID, Ilosc, CenaJednostkowa) VALUES
(1, 1, 1, 4500.00),
(2, 2, 2, 999.99),
(2, 3, 1, 350.50),
(3, 4, 5, 150.00),
(3, 5, 1, 499.00);
    

Dział IV. Stosowanie Strukturalnego Języka Zapytań SQL (17h)

17. Składnia poleceń w języku SQL (DDL, DML, DCL) (2h)

17.1. Wyszukiwanie danych (SELECT, gwiazdka, aliasy)

Co robimy: Uczymy się podstawowego zapytania SELECT. Pokazujemy, jak wyświetlać wszystkie dane (SELECT *) oraz jak wybierać tylko potrzebne kolumny, nadając im czytelne aliasy (AS).

Zadanie: Wyświetl wszystkie produkty z magazynu. Następnie wyświetl tylko ich nazwy i ceny, zmieniając nagłówek kolumny Cena na Kwota_Netto.

17.2. Dodawanie danych (INSERT INTO)

Co robimy: Polecenie INSERT INTO służy do wstawiania nowego rekordu do tabeli. Wartości muszą pasować do kolejności i typu danych kolumn.

Zadanie: Wstaw do tabeli Produkty nowy produkt o nazwie "Drukarka 3D" i cenie 1200.00. Ilość magazynową ustaw na 0.

17.3. Usuwanie danych (DELETE FROM)

Co robimy: Polecenie DELETE FROM służy do usuwania danych. Pamiętaj: zawsze używamy klauzuli WHERE, aby wskazać dokładnie, który rekord ma zostać usunięty.

Zadanie: Wstaw nowego klienta "Zając", a następnie go usuń. Użyj KlientID = 4 (jeśli jest to kolejny wolny identyfikator).

17.4. Modyfikowanie kolumny (DDL: ALTER TABLE)

Co robimy: Uczymy się zmieniać strukturę tabeli za pomocą ALTER TABLE. Pokażemy, jak usunąć istniejącą kolumnę.

Zadanie: Usuń z tabeli Produkty kolumnę Opis.

17.5. Aktualizacja danych (UPDATE)

Co robimy: Polecenie UPDATE służy do zmiany wartości w istniejących rekordach. Określamy, co zmienić (SET) i który rekord (WHERE).

Zadanie: Zmień status zamówienia o ZamowienieID = 2 z "Nowe" na "Wysłane".

18. Tworzenie struktury bazy danych (DDL: CREATE TABLE, constraints) (6h)

18.1. Definiowanie ograniczeń (CHECK, NOT NULL)

Co robimy: Dodajemy ograniczenie CHECK, aby ilość magazynowa nigdy nie była ujemna.

Zadanie: Dodaj do tabeli Produkty ograniczenie CHECK, które zagwarantuje, że IloscMagazyn nie jest mniejsza niż 0.

18.2. Klucze główne (PRIMARY KEY) i indeksy

Co robimy: Tworzymy tabelę z kluczem głównym, który automatycznie się inkrementuje.

Zadanie: Utwórz nową tabelę Kategorie z kolumną KategoriaID jako kluczem głównym AUTO_INCREMENT.

18.3. Tworzenie relacji (FOREIGN KEY)

Co robimy: Dodajemy do Produkty kolumnę KategoriaID i ustawiamy ją jako klucz obcy do tabeli Kategorie.

Zadanie: Zmodyfikuj tabelę Produkty, aby zawierała klucz obcy do Kategorie.

18.4. Unikalność danych (UNIQUE)

Co robimy: Wymuszamy unikalność wartości w kolumnie.

Zadanie: Dodaj do tabeli Klienci ograniczenie UNIQUE na kolumnie Nazwisko.

18.5. Tabela logująca zmiany cen

Co robimy: Tworzymy tabelę Logi_Cen do zapisywania historii zmian cen produktów.

Zadanie: Stwórz tabelę Logi_Cen z kolumnami: LogID, ProduktID, DataZmiany, z kluczem obcym do Produkty.

19. Wyszukiwanie informacji w bazie danych (SELECT, JOIN) (10h)

19.1. Filtrowanie złożone (WHERE, LIKE, BETWEEN, ORDER BY)

Co robimy: Uczymy się precyzyjnego filtrowania za pomocą LIKE, AND, OR oraz sortowania ORDER BY.

Zadanie: Znajdź klientów, których nazwisko zaczyna się na "K" lub "W" i którzy zarejestrowali się po dacie "2024-01-01". Wyniki posortuj alfabetycznie.

19.2. Agregacja i grupowanie (GROUP BY, MAX, MIN, AVG, COUNT)

Co robimy: Używamy funkcji agregujących do podsumowania danych oraz GROUP BY do grupowania wyników.

Zadanie: Oblicz najwyższą, najniższą i średnią cenę produktów. Następnie policz zamówienia w podziale na status.

19.3. Klienci bez zamówień (LEFT JOIN)

Co robimy: Używamy LEFT JOIN, aby znaleźć klientów, którzy nie złożyli żadnego zamówienia.

Zadanie: Wyświetl nazwiska wszystkich klientów i ID ich zamówień, a następnie tylko tych, którzy nie mają zamówień.

19.4. Złączenie wielu tabel i HAVING

Co robimy: Łączymy trzy tabele i liczymy łączne wydatki klienta, filtrując wyniki klauzulą HAVING.

Zadanie: Pokaż klientów, którzy wydali ponad 2000 zł.

19.5. Podzapytania – znajdowanie ekstremalnych wartości

Co robimy: Używamy podzapytania w WHERE, aby znaleźć najdroższy produkt.

Zadanie: Znajdź nazwę i cenę najdroższego produktu.

19.6. Złączenia, podzapytania i zaawansowane zapytania

Co robimy: Łączymy cztery tabele i używamy agregacji do analizy wartości zamówień.

Zadanie: Znajdź klientów, którzy kupili "Laptop Gamingowy" oraz zamówienia o wartości powyżej 1500 zł.

20. Aktualizacja bazy danych (INSERT, UPDATE, DELETE, transakcje) (8h)

20.1. Aktualizacja rekordów (UPDATE z operacjami matematycznymi)

Co robimy: Modyfikujemy dane z użyciem działań matematycznych w klauzuli SET.

Zadanie: Zmień adres e-mail klienta o ID=2 i zastosuj 10% rabatu dla produktów droższych niż 1000 zł.

20.2. Usuwanie danych (DELETE z podzapytaniem)

Co robimy: Ćwiczymy usuwanie danych w powiązanych tabelach.

Zadanie: Usuń szczegóły zamówienia dla produktu o ID=3, a następnie usuń wszystkie zamówienia o statusie "Anulowane".

20.3. INSERT INTO... SELECT

Co robimy: Kopiujemy dane klientów z zamówieniami o statusie "Wysłane" do tabeli archiwalnej.

Zadanie: Utwórz tabelę Klienci_Archiwum i przenieś do niej klientów z wysłanymi zamówieniami.

20.4. Transakcje i COMMIT

Co robimy: Używamy transakcji, aby kilka operacji wykonało się jako całość.

Zadanie: Obniż cenę produktu ID=4 o 10 zł i dopisz log do Logi_Cen w ramach jednej transakcji.

20.5. Transakcje i ROLLBACK

Co robimy: Pokazujemy, jak cofnąć zmiany wykonane w transakcji.

Zadanie: Zmień tymczasowo nazwisko klienta ID=1 i cofnij zmiany poleceniem ROLLBACK.

21. Tworzenie skryptów w SQL (VIEW, procedury, funkcje, triggery) (6h)

21.1. Łączenie poleceń w skrypty (batch)

Co robimy: Wykonujemy sekwencję poleceń SQL razem, aby zautomatyzować operacje.

Zadanie: Zwiększ cenę wszystkich produktów o 5% i wyświetl zaktualizowaną listę.

21.2. Widoki (VIEW)

Co robimy: Tworzymy widok łączący klientów z ich zamówieniami.

Zadanie: Stwórz widok Raport_Wydatki_Klienta z nazwiskiem klienta, ID zamówienia i datą zamówienia.

21.3. Procedury składowane (stored procedures)

Co robimy: Tworzymy procedurę usuwającą klienta wraz z jego zamówieniami i szczegółami.

Zadanie: Stwórz procedurę UsunKlienta, która przyjmuje id_klienta.

21.4. Funkcje składowane (stored functions)

Co robimy: Tworzymy funkcję zwracającą status zamówienia.

Zadanie: Stwórz funkcję SprawdzStatus, która przyjmuje id_zamowienia i zwraca tekstowy status.

21.5. Wyzwalacze (triggers)

Co robimy: Tworzymy wyzwalacz logujący zmiany cen produktów.

Zadanie: Stwórz wyzwalacz after_product_update, który dopisze wpis do Logi_Cen po zmianie ceny.

✅ Podsumowanie i ćwiczenia zbiorcze

22. Powtórzenie materiału i zadania praktyczne (10h)

22.1. Pełny cykl życia zamówienia

Zadanie: Wykonaj pełny cykl: od dodania klienta, przez złożenie zamówienia, po zmianę statusu na "Wysłane".

22.2. Najlepiej sprzedający się produkt

Zadanie: Znajdź produkt sprzedany w największej łącznej ilości.

22.3. Raport finansowy (SUMA i VIEW)

Zadanie: Stwórz widok Wartosc_Zamowienia_Raport, a następnie oblicz łączną wartość zamówień o statusie "Wysłane".