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;
| ID | Numer | Typ | Cena/noc |
| 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 |
Ćwiczenie 2: Lista wszystkich gości
SELECT * FROM goscie;
| ID | Imię | Nazwisko | Telefon | Email |
| 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 |
Ć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ę | Nazwisko | Pokój | Typ |
| Jan | Kowalski | 101 | Jednoosobowy |
| Anna | Nowak | 102 | Dwuosobowy |
| Piotr | Wiśniewski | 103 | Apartament |
| Ewa | Kaczmarek | 102 | Dwuosobowy |
| Jan | Kowalski | 203 | Apartament |
Ć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ę | Nazwisko | Liczba rezerwacji |
| Marek | Zieliński | 3 |
| Ewa | Kaczmarek | 2 |
| Tomasz | Wójcik | 0 |
Ć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ę | Nazwisko | Liczba dni |
| Anna | Nowak | 3 |
| Piotr | Wiśniewski | 5 |
| Ewa | Kaczmarek | 4 |