Dataczwartek, 13 sierpnia 2026 Czas18:21:14
← Zadania praktyczne

Zadanie 16 (egzaminacyjne): Salon fryzjerski — analiza dat i czasu

Trudny / egzaminacyjny

Po co się tego uczymy?

Praca z datami i godzinami (DATETIME) to osobna umiejętność — ten zestaw ćwiczy filtrowanie po zakresach dat, co często pojawia się w prawdziwych systemach rezerwacyjnych.

Treść zadania

Scenariusz: Salon fryzjerski Stylowy rejestruje wizyty klientów.

Krok 1: Zaimportuj bazę z kodu poniżej.

Krok 2 — zapytania:
1. Pokaż wszystkie wizyty zaplanowane na marzec 2026, razem z imieniem klienta i nazwą usługi.
2. Policz łączny przychód każdego fryzjera (JOIN Wizyty+Uslugi + SUM).
3. Znajdź klienta, który odwiedził salon najwięcej razy.
4. Pokaż usługi, które trwają dłużej niż 60 minut i kosztują więcej niż 100 zł.
5. Oblicz, ile łącznie minut pracy mieli zaplanowane wszyscy fryzjerzy razem w marcu.
6. Znajdź fryzjera, który NIE miał żadnej wizyty z usługą "Trwała" (podpowiedź: NOT IN z podzapytaniem).

Jak zabrać się do zadania

1. Pobierz plik .sql przyciskiem w sekcji "Rozwiązanie" na dole strony.
2. Uruchom Apache i MySQL w XAMPP Control Panel.
3. W phpMyAdmin utwórz pustą bazę danych o podanej nazwie.
4. Kliknij w nazwę tej bazy w lewym panelu, żeby ją wybrać jako aktywną.
5. Przejdź do zakładki "Importuj" (nie "SQL"), kliknij "Wybierz plik", wskaż pobrany plik i kliknij "Wykonaj".
6. Dopiero po potwierdzonym imporcie przejdź do wykonywania zapytań z listy.

Jak powinien wyglądać efekt

Zapytanie 6 (fryzjer bez usługi "Trwała") powinien wskazać dokładnie jedną osobę z trzech fryzjerów w bazie — sprawdź w danych startowych, kto faktycznie miał przypisaną tę usługę.

Typowe problemy i jak sobie z nimi poradzić

Przy filtrowaniu po miesiącu (zapytanie 1) łatwo o błąd z zakresem dat — bezpieczniej użyć np. data_wizyty BETWEEN '2026-03-01' AND '2026-03-31 23:59:59' niż tylko porównania roku i miesiąca osobno.

Nawiązanie do egzaminu zawodowego

To zadanie w konwencji egzaminacyjnej ćwiczy jednostkę INF.03.4 jako całość — dokładnie tak wygląda część "Operacje na bazie danych" prawdziwego arkusza części praktycznej egzaminu INF.03.

Kryteria sukcesu — sprawdź, czy wykonałeś zadanie poprawnie

Po wykonaniu zadania sprawdź, czy:
1. zapytanie 1 poprawnie filtruje cały miesiąc marzec 2026 (nie tylko wybrane dni),
2. zapytanie 2 poprawnie sumuje przychód każdego fryzjera,
3. zapytanie 6 (fryzjer bez usługi Trwała) wskazuje dokładnie właściwą osobę,
4. rozumiesz, dlaczego DATETIME wymaga innej obsługi niż zwykłe DATE.

Rozwiązanie — gotowa baza danych

Pobierz plik i zaimportuj go w phpMyAdmin przez zakładkę „Importuj” — dokładnie tak, jak wygląda to na prawdziwym egzaminie. Blok kodu poniżej to podgląd zawartości tego samego pliku, przydatny do sprawdzenia struktury bez otwierania go osobno.

Pobierz plik .sql

CREATE DATABASE IF NOT EXISTS salon_stylowy;
USE salon_stylowy;

CREATE TABLE Fryzjerzy (
    id_fryzjera INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50), nazwisko VARCHAR(50)
);
CREATE TABLE Uslugi (
    id_uslugi INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(80), cena DECIMAL(6,2), czas_minuty INT
);
CREATE TABLE Klienci (
    id_klienta INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50), nazwisko VARCHAR(50), telefon VARCHAR(15)
);
CREATE TABLE Wizyty (
    id_wizyty INT AUTO_INCREMENT PRIMARY KEY,
    id_klienta INT, id_fryzjera INT, id_uslugi INT, data_wizyty DATETIME,
    FOREIGN KEY (id_klienta) REFERENCES Klienci(id_klienta),
    FOREIGN KEY (id_fryzjera) REFERENCES Fryzjerzy(id_fryzjera),
    FOREIGN KEY (id_uslugi) REFERENCES Uslugi(id_uslugi)
);

INSERT INTO Fryzjerzy (imie, nazwisko) VALUES ('Klaudia','Majewska'),('Marcin','Sokół'),('Weronika','Duda');
INSERT INTO Uslugi (nazwa, cena, czas_minuty) VALUES
('Strzyżenie damskie', 80.00, 45), ('Strzyżenie męskie', 40.00, 30),
('Farbowanie', 150.00, 90), ('Modelowanie', 60.00, 40), ('Trwała', 200.00, 120);

INSERT INTO Klienci (imie, nazwisko, telefon) VALUES
('Alicja','Tomczyk','601111222'),('Bogdan','Krupa','601222333'),
('Celina','Wilk','601333444'),('Dawid','Sobolewski','601444555');

INSERT INTO Wizyty (id_klienta, id_fryzjera, id_uslugi, data_wizyty) VALUES
(1,1,1,'2026-03-01 10:00'), (2,2,2,'2026-03-01 11:00'),
(1,1,3,'2026-03-08 10:00'), (3,3,4,'2026-03-01 12:30'),
(4,2,2,'2026-03-02 09:00'), (3,1,5,'2026-03-09 14:00'),
(2,2,2,'2026-03-15 11:00'), (1,3,4,'2026-03-15 15:00');