Komis samochodowy - Zaawansowane ćwiczenia SQL
Struktura bazy danych
samochody
CREATE TABLE samochody (
id_samochodu INT PRIMARY KEY,
marka VARCHAR(50),
model VARCHAR(50),
rok INT,
cena DECIMAL(10,2)
);
INSERT INTO samochody VALUES
(1, 'Toyota', 'Corolla', 2018, 65000),
(2, 'BMW', 'X5', 2020, 250000),
(3, 'Ford', 'Focus', 2019, 72000),
(4, 'Audi', 'A4', 2021, 180000),
(5, 'Honda', 'Civic', 2017, 55000),
(6, 'Mercedes', 'C200', 2020, 220000),
(7, 'Skoda', 'Octavia', 2018, 70000);
klienci
CREATE TABLE klienci (
id_klienta INT PRIMARY KEY,
imie VARCHAR(30),
nazwisko VARCHAR(30),
telefon VARCHAR(20)
);
INSERT INTO klienci VALUES
(1, 'Jan', 'Kowalski', '600123456'),
(2, 'Anna', 'Nowak', '601234567'),
(3, 'Piotr', 'Wiśniewski', '602345678'),
(4, 'Ewa', 'Kaczmarek', '603456789');
pracownicy
CREATE TABLE pracownicy (
id_pracownika INT PRIMARY KEY,
imie VARCHAR(30),
nazwisko VARCHAR(30),
stanowisko VARCHAR(30)
);
INSERT INTO pracownicy VALUES
(1, 'Marek', 'Zieliński', 'Sprzedawca'),
(2, 'Ewa', 'Kaczmarek', 'Kierownik'),
(3, 'Tomasz', 'Wójcik', 'Sprzedawca');
sprzedaz
CREATE TABLE sprzedaz (
id_sprzedazy INT PRIMARY KEY,
id_samochodu INT,
id_klienta INT,
id_pracownika INT,
data_sprzedazy DATE,
FOREIGN KEY (id_samochodu) REFERENCES samochody(id_samochodu),
FOREIGN KEY (id_klienta) REFERENCES klienci(id_klienta),
FOREIGN KEY (id_pracownika) REFERENCES pracownicy(id_pracownika)
);
INSERT INTO sprzedaz VALUES
(1, 1, 1, 1, '2025-09-01'),
(2, 3, 2, 3, '2025-09-05'),
(3, 2, 3, 2, '2025-09-10'),
(4, 4, 4, 1, '2025-09-12'),
(5, 5, 2, 3, '2025-09-15'),
(6, 6, 1, 2, '2025-09-18');
Ćwiczenia SQL
Ćwiczenie 1: Lista wszystkich samochodów
SELECT * FROM samochody;
Ćwiczenie 2: Lista wszystkich klientów
SELECT * FROM klienci;
Ćwiczenie 3: Samochody sprzedane powyżej 100000
SELECT s.marka, s.model, s.cena
FROM samochody s
JOIN sprzedaz sp ON s.id_samochodu = sp.id_samochodu
WHERE s.cena > 100000;
Ćwiczenie 4: Klienci i ich zakupione samochody
SELECT k.imie, k.nazwisko, s.marka, s.model, sp.data_sprzedazy
FROM klienci k
JOIN sprzedaz sp ON k.id_klienta = sp.id_klienta
JOIN samochody s ON sp.id_samochodu = s.id_samochodu;
Ćwiczenie 5: Liczba samochodów sprzedanych przez każdego pracownika
SELECT p.imie, p.nazwisko, COUNT(sp.id_sprzedazy) AS liczba_sprzedanych
FROM pracownicy p
JOIN sprzedaz sp ON p.id_pracownika = sp.id_pracownika
GROUP BY p.id_pracownika;
Ćwiczenie 6: Średnia cena sprzedanych samochodów
SELECT AVG(s.cena) AS srednia_cena
FROM samochody s
JOIN sprzedaz sp ON s.id_samochodu = sp.id_samochodu;
Ćwiczenie 7: Najdroższy sprzedany samochód
SELECT s.marka, s.model, s.cena
FROM samochody s
JOIN sprzedaz sp ON s.id_samochodu = sp.id_samochodu
ORDER BY s.cena DESC
LIMIT 1;
Ćwiczenie 8: Klienci, którzy kupili więcej niż jeden samochód
SELECT k.imie, k.nazwisko, COUNT(sp.id_sprzedazy) AS liczba_samochodow
FROM klienci k
JOIN sprzedaz sp ON k.id_klienta = sp.id_klienta
GROUP BY k.id_klienta
HAVING liczba_samochodow > 1;
Ćwiczenie 9: Lista samochodów i ich sprzedawców
SELECT s.marka, s.model, p.imie, p.nazwisko
FROM samochody s
JOIN sprzedaz sp ON s.id_samochodu = sp.id_samochodu
JOIN pracownicy p ON sp.id_pracownika = p.id_pracownika;
Ćwiczenie 10: Sprzedaż według roku samochodu
SELECT s.rok, COUNT(sp.id_sprzedazy) AS liczba_sprzedanych
FROM samochody s
JOIN sprzedaz sp ON s.id_samochodu = sp.id_samochodu
GROUP BY s.rok
ORDER BY s.rok;
Ćwiczenie 11: Wartość sprzedanych samochodów dla każdego pracownika
SELECT p.imie, p.nazwisko, SUM(s.cena) AS wartosc_sprzedazy
FROM pracownicy p
JOIN sprzedaz sp ON p.id_pracownika = sp.id_pracownika
JOIN samochody s ON sp.id_samochodu = s.id_samochodu
GROUP BY p.id_pracownika;
Ćwiczenie 12: Samochody jeszcze niesprzedane
SELECT * FROM samochody
WHERE id_samochodu NOT IN (SELECT id_samochodu FROM sprzedaz);
Ćwiczenie 13: Widok - Sprzedaż szczegółowa
CREATE VIEW widok_sprzedaz AS
SELECT sp.id_sprzedazy, k.imie, k.nazwisko, s.marka, s.model, p.imie AS sprzedawca_imie, p.nazwisko AS sprzedawca_nazwisko, sp.data_sprzedazy
FROM sprzedaz sp
JOIN klienci k ON sp.id_klienta = k.id_klienta
JOIN samochody s ON sp.id_samochodu = s.id_samochodu
JOIN pracownicy p ON sp.id_pracownika = p.id_pracownika;
Ćwiczenie 14: Samochody sprzedane w 2025-09-05
SELECT s.marka, s.model, k.imie, k.nazwisko
FROM sprzedaz sp
JOIN samochody s ON sp.id_samochodu = s.id_samochodu
JOIN klienci k ON sp.id_klienta = k.id_klienta
WHERE sp.data_sprzedazy = '2025-09-05';
Ćwiczenie 15: Top 3 najdroższe sprzedane samochody
SELECT s.marka, s.model, s.cena
FROM samochody s
JOIN sprzedaz sp ON s.id_samochodu = sp.id_samochodu
ORDER BY s.cena DESC
LIMIT 3;
Ćwiczenie 16: Liczba klientów przypadająca na każdego sprzedawcę
SELECT p.imie, p.nazwisko, COUNT(DISTINCT sp.id_klienta) AS liczba_klientow
FROM pracownicy p
JOIN sprzedaz sp ON p.id_pracownika = sp.id_pracownika
GROUP BY p.id_pracownika;
Ćwiczenie 17: Samochody z rokiem produkcji >= 2020
SELECT * FROM samochody
WHERE rok >= 2020;
Ćwiczenie 18: Klienci i całkowita wartość ich zakupów
SELECT k.imie, k.nazwisko, SUM(s.cena) AS wartosc_zakupow
FROM klienci k
JOIN sprzedaz sp ON k.id_klienta = sp.id_klienta
JOIN samochody s ON sp.id_samochodu = s.id_samochodu
GROUP BY k.id_klienta;
Ćwiczenie 19: Samochody posortowane po cenie rosnąco
SELECT * FROM samochody
ORDER BY cena ASC;
Ćwiczenie 20: Średnia cena samochodów kupionych przez sprzedawcę Marek Zieliński
SELECT AVG(s.cena) AS srednia_cena
FROM sprzedaz sp
JOIN samochody s ON sp.id_samochodu = s.id_samochodu
JOIN pracownicy p ON sp.id_pracownika = p.id_pracownika
WHERE p.imie = 'Marek' AND p.nazwisko = 'Zieliński';