CREATE DATABASE IF NOT EXISTS sklep_zoo
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_polish_ci;
USE sklep_zoo;
-- KLIENCI
CREATE TABLE klienci (
klient_id INT PRIMARY KEY AUTO_INCREMENT,
imie VARCHAR(50) NOT NULL,
nazwisko VARCHAR(80) NOT NULL,
miasto VARCHAR(80) NOT NULL,
email VARCHAR(120) UNIQUE
);
-- ZWIERZĘTA (produkty-zwierzęta)
CREATE TABLE zwierzeta (
zwierze_id INT PRIMARY KEY AUTO_INCREMENT,
gatunek VARCHAR(80) NOT NULL, -- np. kot, pies, papuga
rasa VARCHAR(120) NULL, -- np. labrador, brytyjski
cena DECIMAL(10,2) NOT NULL CHECK (cena >= 0)
);
-- AKCESORIA (produkty-akcesoria)
CREATE TABLE akcesoria (
akcesorium_id INT PRIMARY KEY AUTO_INCREMENT,
nazwa VARCHAR(120) NOT NULL,
kategoria VARCHAR(80) NOT NULL, -- np. smycze, karma, kuwety
cena DECIMAL(10,2) NOT NULL CHECK (cena >= 0)
);
-- ZAMÓWIENIA (pozycje) – każdy wiersz to jedna pozycja w zamówieniu
CREATE TABLE zamowienia (
pozycja_id INT PRIMARY KEY AUTO_INCREMENT,
numer_zamowienia VARCHAR(20) NOT NULL, -- grupuje pozycje jednego zamówienia
data_zamowienia DATE NOT NULL,
klient_id INT NOT NULL,
typ_produktu ENUM('zwierze','akcesorium') NOT NULL,
produkt_id INT NOT NULL, -- id z odpowiedniej tabeli
ilosc INT NOT NULL DEFAULT 1 CHECK (ilosc > 0),
cena_jednostkowa DECIMAL(10,2) NOT NULL CHECK (cena_jednostkowa >= 0),
FOREIGN KEY (klient_id) REFERENCES klienci(klient_id)
-- (świadomie bez FK na produkt_id, bo zależy od typ_produktu)
);
INSERT INTO klienci (imie, nazwisko, miasto, email) VALUES
('Anna','Nowak','Warszawa','anna.nowak@example.com'),
('Piotr','Kowalski','Gdańsk','piotr.k@example.com'),
('Maria','Zielińska','Kraków','maria.z@example.com'),
('Jan','Wiśniewski','Poznań','jan.w@example.com');
INSERT INTO zwierzeta (gatunek, rasa, cena) VALUES
('Kot','Brytyjski krótkowłosy',1500.00),
('Pies','Labrador retriever',2500.00),
('Papuga','Nimfa',400.00);
INSERT INTO akcesoria (nazwa, kategoria, cena) VALUES
('Smycz nylonowa','smycze',45.00),
('Kuweta duża','kuwety',60.00),
('Karma premium 5kg','karma',120.00),
('Klatka dla papugi','klatki',300.00);
-- Zamówienia (pozycje)
-- ZAM-001 (Anna, 2025-09-15): papuga + klatka + karma
INSERT INTO zamowienia (numer_zamowienia, data_zamowienia, klient_id, typ_produktu, produkt_id, ilosc, cena_jednostkowa) VALUES
('ZAM-001','2025-09-15',1,'zwierze',3,1,400.00),
('ZAM-001','2025-09-15',1,'akcesorium',4,1,300.00),
('ZAM-001','2025-09-15',1,'akcesorium',3,1,120.00);
-- ZAM-002 (Piotr, 2025-09-16): pies + smycz + 2x karma
INSERT INTO zamowienia VALUES
(NULL,'ZAM-002','2025-09-16',2,'zwierze',2,1,2500.00),
(NULL,'ZAM-002','2025-09-16',2,'akcesorium',1,1,45.00),
(NULL,'ZAM-002','2025-09-16',2,'akcesorium',3,2,120.00);
-- ZAM-003 (Maria, 2025-09-20): kot + kuweta
INSERT INTO zamowienia VALUES
(NULL,'ZAM-003','2025-09-20',3,'zwierze',1,1,1500.00),
(NULL,'ZAM-003','2025-09-20',3,'akcesorium',2,1,60.00);
-- ZAM-004 (Jan, 2025-09-22): smycz + karma
INSERT INTO zamowienia VALUES
(NULL,'ZAM-004','2025-09-22',4,'akcesorium',1,1,45.00),
(NULL,'ZAM-004','2025-09-22',4,'akcesorium',3,1,120.00);
Zadania – zapytania SQL dla ucznia
- Wyświetl wszystkie zwierzęta tańsze niż 1000 zł.
- Wyświetl listę klientów posortowaną alfabetycznie według miasta, a w obrębie miasta według nazwiska.
- Wyświetl wszystkie pozycje zamówień z nazwą produktu (zwierzę lub akcesorium) oraz wartością (ilość × cena).
- Oblicz sumę wartości każdego zamówienia (dla numeru ZAM-001, ZAM-002 itd.).
- Podaj łączną wartość sprzedaży z podziałem na typ produktu (zwierzęta i akcesoria).
- Znajdź zamówienie o najwyższej wartości (suma całego zamówienia).
- Wyświetl listę klientów, którzy kupili jakiekolwiek zwierzę.
- Podaj trzy najczęściej kupowane akcesoria (wg liczby sztuk).
- Oblicz średnią wartość zamówienia dla każdego klienta.
- Znajdź numery zamówień, które zawierały wyłącznie akcesoria (bez żadnego zwierzęcia).