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