Dataniedziela, 9 sierpnia 2026 Czas06:55:16
← Zadania praktyczne

Zadanie 18 (egzaminacyjne): Klinika weterynaryjna WetVet — złożone zestawienia

Trudny / egzaminacyjny

Po co się tego uczymy?

Cztery powiązane tabele i pytania wymagające połączenia kilku technik naraz (JOIN + agregacja + podzapytanie) — to już niemal poziom pełnego zadania egzaminacyjnego.

Treść zadania

Scenariusz: Klinika weterynaryjna WetVet prowadzi rejestr pacjentów (zwierząt), właścicieli i wykonanych zabiegów.

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

Krok 2 — zapytania:
1. Pokaż wszystkie wizyty razem z imieniem zwierzęcia, jego gatunkiem i nazwą wykonanego zabiegu.
2. Policz łączny koszt leczenia dla każdego zwierzęcia.
3. Znajdź właściciela, który wydał najwięcej na leczenie swoich zwierząt łącznie (JOIN wszystkich czterech tabel + GROUP BY po właścicielu).
4. Znajdź zwierzę, u którego NIGDY nie wykonano szczepienia (podpowiedź: NOT IN z podzapytaniem po id_zabiegu odpowiadającym "Szczepienie").
5. Pokaż gatunek zwierząt, na których leczenie wydano łącznie najwięcej pieniędzy.
6. Stwórz widok (VIEW) HistoriaLeczenia pokazujący imię zwierzęcia, nazwisko właściciela, nazwę zabiegu i datę — gotowy do wielokrotnego użycia.

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 3 (właściciel, który wydał najwięcej) powinien wskazać JEDNĄ konkretną osobę spośród trzech właścicieli w bazie startowej. Po wykonaniu zapytania 6 w lewym panelu phpMyAdmin, obok tabel, pojawi się nowy obiekt HistoriaLeczenia oznaczony jako widok — możesz go odpytać jak zwykłą tabelę: SELECT * FROM HistoriaLeczenia;

Typowe problemy i jak sobie z nimi poradzić

W zadaniu 4 nie da się po prostu napisać "gatunek = pies AND zabieg != szczepienie", bo to pokaże psy z INNYMI zabiegami — trzeba sprawdzić, czy dane zwierzę w OGÓLE nie ma w historii żadnego szczepienia, stąd podzapytanie z NOT IN.

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 3 wskazuje dokładnie jednego właściciela o najwyższych łącznych kosztach,
2. zapytanie 4 poprawnie używa podzapytania z NOT IN do znalezienia zwierzęcia bez szczepienia,
3. widok HistoriaLeczenia z zapytania 6 faktycznie istnieje i zwraca dane po SELECT * FROM HistoriaLeczenia,
4. wszystkie zapytania łączą poprawnie cztery tabele bez duplikowania wierszy.

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 klinika_wetvet;
USE klinika_wetvet;

CREATE TABLE Wlasciciele (
    id_wlasciciela INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50), nazwisko VARCHAR(50), telefon VARCHAR(15)
);
CREATE TABLE Zwierzeta (
    id_zwierzecia INT AUTO_INCREMENT PRIMARY KEY,
    imie VARCHAR(50), gatunek VARCHAR(30), wiek INT, id_wlasciciela INT,
    FOREIGN KEY (id_wlasciciela) REFERENCES Wlasciciele(id_wlasciciela)
);
CREATE TABLE Zabiegi (
    id_zabiegu INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(80), cena DECIMAL(7,2)
);
CREATE TABLE Wizyty (
    id_wizyty INT AUTO_INCREMENT PRIMARY KEY,
    id_zwierzecia INT, id_zabiegu INT, data_wizyty DATE,
    FOREIGN KEY (id_zwierzecia) REFERENCES Zwierzeta(id_zwierzecia),
    FOREIGN KEY (id_zabiegu) REFERENCES Zabiegi(id_zabiegu)
);

INSERT INTO Wlasciciele (imie, nazwisko, telefon) VALUES
('Marta','Olejniczak','602111222'),('Grzegorz','Wrona','602222333'),('Julia','Kowal','602333444');

INSERT INTO Zwierzeta (imie, gatunek, wiek, id_wlasciciela) VALUES
('Reksio','pies',3,1), ('Mruczek','kot',5,1), ('Fistaszek','królik',2,2),
('Burek','pies',7,2), ('Whiskas','kot',1,3), ('Rex','pies',4,3);

INSERT INTO Zabiegi (nazwa, cena) VALUES
('Szczepienie', 90.00), ('Odrobaczanie', 40.00), ('Kastracja', 350.00),
('Przegląd ogólny', 60.00), ('Czyszczenie zębów', 180.00);

INSERT INTO Wizyty (id_zwierzecia, id_zabiegu, data_wizyty) VALUES
(1,1,'2026-01-10'), (1,4,'2026-01-10'), (2,4,'2026-01-15'),
(3,2,'2026-01-20'), (4,3,'2026-02-01'), (5,1,'2026-02-05'),
(6,4,'2026-02-10'), (2,1,'2026-03-01'), (1,3,'2026-03-05'),
(4,4,'2026-03-08');