Hotel i rezerwacje - baza SQL

Struktura bazy danych

pokoje

CREATE TABLE pokoje ( id_pokoju INT PRIMARY KEY, numer_pokoju VARCHAR(10), typ VARCHAR(20), cena_noc DECIMAL(8,2) ); INSERT INTO pokoje VALUES (1, '101', 'Jednoosobowy', 150.00), (2, '102', 'Dwuosobowy', 220.00), (3, '103', 'Apartament', 450.00), (4, '201', 'Jednoosobowy', 160.00), (5, '202', 'Dwuosobowy', 230.00), (6, '203', 'Apartament', 480.00);

goscie

CREATE TABLE goscie ( id_goscia INT PRIMARY KEY, imie VARCHAR(30), nazwisko VARCHAR(30), telefon VARCHAR(20), email VARCHAR(50) ); INSERT INTO goscie VALUES (1, 'Jan', 'Kowalski', '600123456', 'jan.kowalski@mail.com'), (2, 'Anna', 'Nowak', '601234567', 'anna.nowak@mail.com'), (3, 'Piotr', 'Wiśniewski', '602345678', 'piotr.wisniewski@mail.com'), (4, 'Ewa', 'Kaczmarek', '603456789', 'ewa.kaczmarek@mail.com');

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', 'Recepcjonista'), (2, 'Ewa', 'Kaczmarek', 'Manager'), (3, 'Tomasz', 'Wójcik', 'Sprzątacz');

rezerwacje

CREATE TABLE rezerwacje ( id_rezerwacji INT PRIMARY KEY, id_pokoju INT, id_goscia INT, id_pracownika INT, data_przyjazdu DATE, data_wyjazdu DATE, FOREIGN KEY (id_pokoju) REFERENCES pokoje(id_pokoju), FOREIGN KEY (id_goscia) REFERENCES goscie(id_goscia), FOREIGN KEY (id_pracownika) REFERENCES pracownicy(id_pracownika) ); INSERT INTO rezerwacje VALUES (1, 1, 1, 1, '2025-09-01', '2025-09-03'), (2, 2, 2, 1, '2025-09-02', '2025-09-05'), (3, 3, 3, 2, '2025-09-05', '2025-09-10'), (4, 2, 4, 1, '2025-09-08', '2025-09-12'), (5, 6, 1, 2, '2025-09-15', '2025-09-18');

Ćwiczenia SQL z efektami

Ćwiczenie 1: Lista wszystkich pokoi

SELECT * FROM pokoje;
IDNumerTypCena/noc
1101Jednoosobowy150.00
2102Dwuosobowy220.00
3103Apartament450.00
4201Jednoosobowy160.00
5202Dwuosobowy230.00
6203Apartament480.00

Ćwiczenie 2: Lista wszystkich gości

SELECT * FROM goscie;
IDImięNazwiskoTelefonEmail
1JanKowalski600123456jan.kowalski@mail.com
2AnnaNowak601234567anna.nowak@mail.com
3PiotrWiśniewski602345678piotr.wisniewski@mail.com
4EwaKaczmarek603456789ewa.kaczmarek@mail.com

Ćwiczenie 3: Goście i ich pokoje

SELECT g.imie, g.nazwisko, p.numer_pokoju, p.typ FROM rezerwacje r JOIN goscie g ON r.id_goscia = g.id_goscia JOIN pokoje p ON r.id_pokoju = p.id_pokoju;
ImięNazwiskoPokójTyp
JanKowalski101Jednoosobowy
AnnaNowak102Dwuosobowy
PiotrWiśniewski103Apartament
EwaKaczmarek102Dwuosobowy
JanKowalski203Apartament

Ćwiczenie 4: Liczba rezerwacji dokonanych przez każdego pracownika

SELECT pr.imie, pr.nazwisko, COUNT(r.id_rezerwacji) AS liczba_rezerwacji FROM pracownicy pr LEFT JOIN rezerwacje r ON pr.id_pracownika = r.id_pracownika GROUP BY pr.id_pracownika;
ImięNazwiskoLiczba rezerwacji
MarekZieliński3
EwaKaczmarek2
TomaszWójcik0

Ćwiczenie 5: Średnia cena noclegu w rezerwacjach

SELECT AVG(p.cena_noc) AS srednia_cena FROM rezerwacje r JOIN pokoje p ON r.id_pokoju = p.id_pokoju;
304.00

Ćwiczenie 6: Rezerwacje dłuższe niż 3 dni

SELECT g.imie, g.nazwisko, DATEDIFF(r.data_wyjazdu, r.data_przyjazdu) AS liczba_dni FROM rezerwacje r JOIN goscie g ON r.id_goscia = g.id_goscia WHERE DATEDIFF(r.data_wyjazdu, r.data_przyjazdu) > 3;
ImięNazwiskoLiczba dni
AnnaNowak3
PiotrWiśniewski5
EwaKaczmarek4