Zadanie 19 (egzaminacyjne): Sklep zoologiczny — pełne zestawienie sprzedażowe
Trudny / egzaminacyjnyPo co się tego uczymy?
To najtrudniejsze z zadań przygotowawczych — pięć powiązanych tabel (w tym klasyczna para Zamówienia + PozycjeZamówienia, jak w prawdziwych sklepach internetowych) i zapytania łączące wszystko, czego się nauczyłeś. Jeśli poradzisz sobie z tym zadaniem, jesteś gotowy na pełne arkusze w Zadaniu 20.
Treść zadania
Scenariusz: Sklep zoologiczny rejestruje zamówienia złożone z wielu pozycji (jedno zamówienie może zawierać kilka różnych produktów — stąd dodatkowa tabela PozycjeZamowienia).
Krok 1: Zaimportuj bazę z kodu poniżej.
Krok 2 — zapytania:
1. Pokaż każde zamówienie razem z nazwami produktów i ilościami (JOIN trzech tabel).
2. Oblicz wartość każdego zamówienia osobno (cena × ilość, zsumowane w ramach jednego zamówienia — GROUP BY id_zamowienia).
3. Znajdź klienta o największej łącznej wartości wszystkich zamówień.
4. Pokaż produkty, które nigdy nie znalazły się w żadnym zamówieniu.
5. Znajdź kategorię produktów generującą największy przychód.
6. Znajdź klientów, którzy złożyli więcej niż jedno zamówienie (GROUP BY + HAVING).
7. Stwórz widok RaportSprzedazyKategorii pokazujący nazwę kategorii i łączną wartość sprzedaży w tej kategorii.
8. Zaktualizuj stan magazynowy każdego sprzedanego produktu, odejmując sprzedane ilości (podobnie jak w Zadaniu 14, ale tym razem dane są rozbite na dwie tabele: Zamowienia i PozycjeZamowienia).
Jak zabrać się do zadania
1. Pobierz plik .sql przyciskiem w sekcji "Rozwiązanie" na dole strony.
2. Uruchom Apache i MySQL w XAMPP Control Panel.
3. W phpMyAdmin utwórz pustą bazę danych o podanej nazwie.
4. Kliknij w nazwę tej bazy w lewym panelu, żeby ją wybrać jako aktywną.
5. Przejdź do zakładki "Importuj" (nie "SQL"), kliknij "Wybierz plik", wskaż pobrany plik i kliknij "Wykonaj".
6. Dopiero po potwierdzonym imporcie przejdź do wykonywania zapytań z listy.
Jak powinien wyglądać efekt
Zapytanie 2 powinno zwrócić tyle wierszy, ile jest zamówień w bazie (6 w danych startowych) — każdy wiersz z inną sumą wartości. Zapytanie 4 (produkty nigdy niezamówione) powinno wskazać konkretne, pojedyncze produkty spośród dziesięciu dostępnych w ofercie.
Typowe problemy i jak sobie z nimi poradzić
Największa pułapka to zapytanie 2 — jeśli zapomnisz GROUP BY id_zamowienia, SUM policzy wartość WSZYSTKICH pozycji ze wszystkich zamówień naraz, zamiast osobno dla każdego zamówienia.
Nawiązanie do egzaminu zawodowego
To zadanie w konwencji egzaminacyjnej ćwiczy jednostkę INF.03.4 jako całość — dokładnie tak wygląda część "Operacje na bazie danych" prawdziwego arkusza części praktycznej egzaminu INF.03.
Kryteria sukcesu — sprawdź, czy wykonałeś zadanie poprawnie
Po wykonaniu zadania sprawdź, czy:
1. zapytanie 2 liczy wartość KAŻDEGO zamówienia osobno (GROUP BY id_zamowienia),
2. zapytanie 4 (produkty nigdy niezamówione) używa LEFT JOIN z tabelą PozycjeZamowienia,
3. widok RaportSprzedazyKategorii z zapytania 7 faktycznie działa,
4. przed UPDATE z punktu 8 sprawdziłeś kontrolnym SELECT-em, jakie ilości zostaną odjęte.
Rozwiązanie — gotowa baza danych
Pobierz plik i zaimportuj go w phpMyAdmin przez zakładkę „Importuj” — dokładnie tak, jak wygląda to na prawdziwym egzaminie. Blok kodu poniżej to podgląd zawartości tego samego pliku, przydatny do sprawdzenia struktury bez otwierania go osobno.
CREATE DATABASE IF NOT EXISTS sklep_zoologiczny;
USE sklep_zoologiczny;
CREATE TABLE KategorieProduktow (
id_kategorii INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(50)
);
CREATE TABLE Produkty (
id_produktu INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100), cena DECIMAL(7,2), ilosc_magazyn INT, id_kategorii INT,
FOREIGN KEY (id_kategorii) REFERENCES KategorieProduktow(id_kategorii)
);
CREATE TABLE Klienci (
id_klienta INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50), nazwisko VARCHAR(50), email VARCHAR(100) UNIQUE
);
CREATE TABLE Zamowienia (
id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
id_klienta INT, data_zamowienia DATE,
FOREIGN KEY (id_klienta) REFERENCES Klienci(id_klienta)
);
CREATE TABLE PozycjeZamowienia (
id_zamowienia INT, id_produktu INT, ilosc INT,
PRIMARY KEY (id_zamowienia, id_produktu),
FOREIGN KEY (id_zamowienia) REFERENCES Zamowienia(id_zamowienia),
FOREIGN KEY (id_produktu) REFERENCES Produkty(id_produktu)
);
INSERT INTO KategorieProduktow (nazwa) VALUES ('Karma dla psów'),('Karma dla kotów'),('Akcesoria'),('Zabawki');
INSERT INTO Produkty (nazwa, cena, ilosc_magazyn, id_kategorii) VALUES
('Karma sucha dla psa 10kg', 149.00, 30, 1), ('Karma mokra dla psa', 8.50, 100, 1),
('Karma sucha dla kota 5kg', 89.00, 40, 2), ('Karma mokra dla kota', 6.00, 150, 2),
('Smycz automatyczna', 65.00, 20, 3), ('Obroża LED', 35.00, 25, 3),
('Piłka dla psa', 19.90, 50, 4), ('Myszka dla kota', 12.00, 60, 4),
('Legowisko dla psa', 129.00, 10, 3), ('Drapak dla kota', 159.00, 8, 3);
INSERT INTO Klienci (imie, nazwisko, email) VALUES
('Agata','Kubicka','agata.k@gmail.com'),('Bartłomiej','Sadowski','bartek.s@wp.pl'),
('Czesława','Górska','czesia.g@onet.pl'),('Dariusz','Wieczorek','dariusz.w@gmail.com');
INSERT INTO Zamowienia (id_klienta, data_zamowienia) VALUES
(1,'2026-02-01'),(2,'2026-02-03'),(1,'2026-02-10'),(3,'2026-02-12'),(4,'2026-02-15'),(2,'2026-02-20');
INSERT INTO PozycjeZamowienia (id_zamowienia, id_produktu, ilosc) VALUES
(1,1,1),(1,7,2),(2,3,2),(2,8,3),(3,2,5),(3,5,1),
(4,4,4),(4,10,1),(5,9,1),(5,6,1),(6,1,1),(6,3,1);