Dataczwartek, 13 sierpnia 2026 Czas18:38:46
← Zadania praktyczne

Zadanie 14 (egzaminacyjne): Apteka Zdrowie — subquery i aktualizacja stanów

Trudny / egzaminacyjny

Po co się tego uczymy?

Tym razem po analizie danych trzeba faktycznie ZMIENIĆ stan magazynu na podstawie wyników sprzedaży — dokładnie tak, jak działa prawdziwy system w aptece.

Treść zadania

Scenariusz: Apteka prowadzi rejestr leków i sprzedaży, chce wiedzieć, które leki się kończą.

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

Krok 2 — zapytania:
1. Pokaż leki, których stan magazynowy jest niższy niż 20 sztuk.
2. Policz łączną liczbę sprzedanych sztuk dla każdego leku.
3. Znajdź lek, który sprzedał się najlepiej (COUNT lub SUM ilości + ORDER BY + LIMIT).
4. Znajdź kategorię leków o najwyższej średniej cenie (podzapytanie z AVG i MAX).
5. Zaktualizuj (UPDATE) stan magazynowy każdego leku, odejmując od niego sumę sprzedanych sztuk — zrób to osobno dla każdego leku, sprawdzając najpierw SELECT-em wynik.
6. Znajdź leki, których NIGDY nie sprzedano (LEFT JOIN + IS NULL).

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

Po wykonaniu UPDATE z punktu 5 stan magazynowy leków, które się sprzedawały, powinien być NIŻSZY niż w danych startowych z Zadania 6 tego arkusza — a leki, których nigdy nie sprzedano (punkt 6), pozostaną bez zmian.

Typowe problemy i jak sobie z nimi poradzić

Zadanie 5 jest ryzykowne — UPDATE na złym warunku WHERE zmieni zły wiersz. Zawsze najpierw sprawdź SELECT-em dokładnie te same warunki, zanim zamienisz go na UPDATE.

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. przed UPDATE z punktu 5 wykonałeś kontrolny SELECT z tym samym warunkiem,
2. stany magazynowe zmniejszyły się dokładnie o sumę sprzedanych sztuk dla każdego leku,
3. zapytanie 4 (kategoria o najwyższej średniej cenie) zwraca dokładnie jedną kategorię,
4. zapytanie 6 (leki nigdy niesprzedane) używa LEFT JOIN, nie INNER JOIN.

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

CREATE TABLE Producenci (
    id_producenta INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(60)
);
CREATE TABLE KategorieLekow (
    id_kategorii INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(50)
);
CREATE TABLE Leki (
    id_leku INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(100), cena DECIMAL(6,2), ilosc_magazyn INT,
    id_producenta INT, id_kategorii INT,
    FOREIGN KEY (id_producenta) REFERENCES Producenci(id_producenta),
    FOREIGN KEY (id_kategorii) REFERENCES KategorieLekow(id_kategorii)
);
CREATE TABLE Sprzedaz (
    id_sprzedazy INT AUTO_INCREMENT PRIMARY KEY,
    id_leku INT, ilosc INT, data_sprzedazy DATE,
    FOREIGN KEY (id_leku) REFERENCES Leki(id_leku)
);

INSERT INTO Producenci (nazwa) VALUES ('Polpharma'),('Bayer'),('GSK'),('Adamed');
INSERT INTO KategorieLekow (nazwa) VALUES ('Przeciwbólowe'),('Witaminy'),('Na przeziębienie'),('Na alergię');

INSERT INTO Leki (nazwa, cena, ilosc_magazyn, id_producenta, id_kategorii) VALUES
('Apap', 12.50, 120, 1, 1), ('Aspirin', 9.90, 80, 2, 1),
('Vitaminum C', 15.00, 200, 4, 2), ('Rutinoscorbin', 18.00, 60, 1, 2),
('Gripex', 22.00, 45, 4, 3), ('Fervex', 25.50, 30, 3, 3),
('Allertec', 28.00, 15, 3, 4), ('Zyrtec', 32.00, 8, 2, 4);

INSERT INTO Sprzedaz (id_leku, ilosc, data_sprzedazy) VALUES
(1,2,'2026-03-01'),(1,1,'2026-03-02'),(3,5,'2026-03-01'),(5,1,'2026-03-03'),
(5,2,'2026-03-04'),(7,1,'2026-03-02'),(8,1,'2026-03-05'),(2,3,'2026-03-05'),
(4,2,'2026-03-06'),(6,1,'2026-03-06');