SQL od podstaw · część 30

Zadanie końcowe SQL: od importu do raportu i odtworzenia

Autorskie ćwiczenie przekrojowe z rozwiązaniami, oczekiwanymi wynikami i mapą materiału do bazodanowej części INF.03.

Część bazodanowa INF.03

Autorskie zadanie praktyczne: sklep CodeNight

To samodzielne zadanie utrwalające bazodanową część INF.03, a nie oficjalny arkusz CKE ani pełny egzamin obejmujący również pozostałe zagadnienia WWW. Zaplanuj około 90–120 minut. Najpierw wykonaj polecenia bez zaglądania do rozwiązań, potem porównaj strukturę zapytań i wyniki.

Pracujesz wyłącznie na syntetycznej bazie kursu. Pobierz pakiet SQL i CSV, wybierz właściwy plik oraz przeczytaj README. Nie importuj go do bazy istniejącej strony. Skrypty dla poszczególnych silników są materiałem do samodzielnego wykonania, a nie deklaracją testów na wszystkich serwerach.

klienci

5 osób; id, imie, miasto, email.

produkty

4 produkty; id, nazwa, cena.

zamowienia

4 zamówienia; klient_id odwołuje się do klienta.

pozycje

6 pozycji; klucz złożony i ilość produktu w zamówieniu.

Wymagania do wykonania

  1. Import i dokumentacja. Utwórz nowe środowisko ćwiczeniowe, zaimportuj dane i sprawdź liczby 5/4/4/6. Zapisz wersję silnika oraz narysuj relacje 1:N i tabelę łączącą N:M. Uzasadnij klucz złożony pozycji.
  2. Filtr i sortowanie. Wyświetl id, nazwę i cenę produktów od 50 do 200 włącznie, od najdroższego, z id jako drugim kryterium porządku.
  3. Wzorzec i limit. Znajdź produkty zaczynające się od K. Osobno pokaż dwa najdroższe produkty, deterministycznie rozstrzygając równe ceny przez id.
  4. Raport. Oblicz wartość każdego zamówienia jako sumę ilość × cena produktu. Pokaż id zamówienia oraz kwotę rosnąco według id. Znajdź też klientów bez żadnych zamówień.
  5. Grupowanie. Pokaż produkty, których łączna zamówiona ilość przekracza 2. Uwzględnij id, nazwę i sumę ilości.
  6. Modyfikacja. Dopiero po zachowaniu wyników odczytu zmień cenę produktu id=4 na 30. Dodaj do zamowienia opcjonalne pole uwagi o maksymalnej długości 120 znaków w docelowym serwerze. Zapisz dla zamówienia id=2 uwagę „Kontakt przed dostawą”.
  7. Aplikacja i raport. Na podstawie części 28–29 zbuduj lokalny formularz wyboru statusu i raport zamówień. Parametryzuj filtr, koduj wynik dla HTML i pokaż komunikat przy pustym wyniku. Konto aplikacji ma mieć tylko wymagane prawa odczytu.
  8. Eksport i odtworzenie. Wyeksportuj zmienioną bazę, odtwórz ją w nowym celu i porównaj dane oraz strukturę. Zachowaj autentyczne zrzuty wykonanych zapytań, bez haseł, danych połączenia i innych kart przeglądarki.

Jeżeli rozwiązujesz wariant z Access, formularz i raport możesz wykonać w Access; wariant PHP pozostaje osobnym ćwiczeniem pomostowym do aplikacji WWW. Na rzeczywistym egzaminie zawsze stosuj środowisko i nazwy plików wskazane w konkretnym arkuszu.

Wypróbuj własne zapytania

Edytor pozwala ćwiczyć odczyt i obsługiwane zmiany na izolowanych danych. Reset przywraca stan początkowy. Wybierz jawny tryb SQLite dla natywnego LIKE. Wybór dialektu MySQL lub SQL Server oznacza ograniczoną emulację składni, nie uruchomienie tych serwerów. Import, PHP, konta, backup i prawdziwe ograniczenia długości VARCHAR wykonaj lokalnie w wybranym SZBD.

Wypróbuj zapytanie

SQLite — rzeczywisty silnik przeglądarki. MySQL / SQL Server — ograniczona emulacja składni. Wybierz tryb SQLite do natywnego LIKE. Pozostałe tryby nie są rzeczywistymi serwerami. Ścisłe typy, auto-ID i administrację ćwicz w prawdziwym SZBD.

Ładowanie edytora…

Rozwiązania: odczyt na stanie początkowym

Zadanie 2 — zakres cen i porządek
SELECT id, nazwa, cena
FROM produkty
WHERE cena BETWEEN 50 AND 200
ORDER BY cena DESC, id ASC;

Wynik: Klawiatura (id=1, 120), Mysz (id=2, 60). BETWEEN obejmuje obie granice. Ta składnia jest wspólna dla porównywanych silników.

Zadanie 3 — LIKE oraz dwa najdroższe produkty
-- MySQL, MariaDB, SQL Server, Oracle, SQLite:
SELECT id, nazwa FROM produkty
WHERE nazwa LIKE 'K%' ORDER BY id;

Na danych ASCII: Klawiatura i Kabel. Access w typowym trybie ANSI-89 używa LIKE 'K*'; w ANSI-92 używa %. Wielkość liter i Unicode zależą od silnika oraz kolacji.

-- MySQL / MariaDB / SQLite
SELECT id, nazwa, cena FROM produkty
ORDER BY cena DESC, id ASC LIMIT 2;

-- SQL Server
SELECT TOP (2) id, nazwa, cena FROM produkty
ORDER BY cena DESC, id ASC;

-- Oracle 19c
SELECT id, nazwa, cena FROM produkty
ORDER BY cena DESC, id ASC FETCH FIRST 2 ROWS ONLY;

-- Access
SELECT TOP 2 id, nazwa, cena FROM produkty
ORDER BY cena DESC, id ASC;

Oczekujemy Monitora (800) i Klawiatury (120). Unikalne id w sortowaniu usuwa remisy całego klucza porządku, ważne również dla zachowania TOP w Access. Oracle i Access pokazujemy jako kod do rzeczywistego środowiska, bez udawania jego działania w selektorze edytora.

Zadanie 4 — wartości zamówień i brak zamówień
SELECT p.zamowienie_id, SUM(p.ilosc * pr.cena) AS wartosc
FROM pozycje p
JOIN produkty pr ON pr.id = p.produkt_id
GROUP BY p.zamowienie_id
ORDER BY p.zamowienie_id;

SELECT k.id, k.imie
FROM klienci k
WHERE NOT EXISTS (
  SELECT 1 FROM zamowienia z WHERE z.klient_id = k.id
)
ORDER BY k.id;

Kwoty: 1 → 240, 2 → 800, 3 → 75, 4 → 110. Razem 1225. Bez zamówień: Ewa (4) i Adam (5). W modelu kursu używamy aktualnej ceny z produkty; w rzeczywistym sklepie cenę historyczną należy zapisać w pozycji transakcji. Te podstawowe konstrukcje są dostępne we wszystkich omawianych silnikach; w Access wykonaj każde zapytanie osobno.

Zadanie 5 — warunek po grupowaniu
SELECT pr.id, pr.nazwa, SUM(p.ilosc) AS sztuki
FROM produkty pr
JOIN pozycje p ON p.produkt_id = pr.id
GROUP BY pr.id, pr.nazwa
HAVING SUM(p.ilosc) > 2
ORDER BY pr.id;

Wynik: Mysz (id=2, 3 sztuki) i Kabel (id=4, 5 sztuk). Warunek sumy grupy należy do HAVING. Nie zastępuj sumy ilości liczbą wierszy pozycji.

Rozwiązania: zmiany i kontrola

Zadanie 6 — UPDATE i ALTER
UPDATE produkty SET cena = 30 WHERE id = 4;

-- MySQL / MariaDB / SQLite: SQLite nie egzekwuje limitu VARCHAR(120)
ALTER TABLE zamowienia ADD COLUMN uwagi VARCHAR(120);

-- SQL Server
ALTER TABLE zamowienia ADD uwagi NVARCHAR(120) NULL;

-- Oracle 19c
ALTER TABLE zamowienia ADD (uwagi VARCHAR2(120 CHAR));

-- Access
ALTER TABLE zamowienia ADD COLUMN uwagi TEXT(120);

Wykonaj tylko jeden wariant ALTER właściwy dla silnika, nie wszystkie. Następnie w MySQL/MariaDB/Oracle/SQLite/Access:

UPDATE zamowienia
SET uwagi = 'Kontakt przed dostawą'
WHERE id = 2;

W SQL Server dla NVARCHAR użyj literału Unicode N'Kontakt przed dostawą'. Sprawdź, czy zmienił się dokładnie wskazany rekord. Po zmianie ceny wartości zamówień 3 i 4 wynoszą 90 i 120, a suma wszystkich 1250. DDL nie jest jednakowo transakcyjne w różnych silnikach.

Zadania 7–8 — aplikacja, eksport i odtworzenie

Wykorzystaj pełny raport PHP z części 29 albo utwórz formularz i raport Access. Sprawdź opłacone zamówienia 1 i 3 oraz nowe 2 i 4, obsługę błędnego filtra i brak sekretów w odpowiedzi. Dla eksportu wybierz strukturę i dane, a przed odtworzeniem sprawdź dyrektywy wskazujące bazę i obiekty do usunięcia. W nowej bazie potwierdź cenę 30 dla id=4, istnienie pola uwagi, tekst dla zamówienia 2 oraz pozostałe rekordy. Sam plik eksportu nie jest dowodem udanego odtworzenia.

Co oddać po ćwiczeniu?

  • zapytania.sql — własne zapytania z krótkimi opisami i oznaczeniem dialektu.
  • schema — diagram E/R z kluczami oraz relacjami i krótkim uzasadnieniem.
  • eksport.sql lub odpowiedni format narzędzia — eksport własnej bazy ćwiczeniowej.
  • raport.php i pozostałe niesekretne pliki aplikacji albo plik Access. Konfigurację przekazuj jako wzór bez hasła.
  • wyniki — rzeczywiste zrzuty zapytań oraz wyników, wykonane we własnej aplikacji.
  • protokol.txt — wersja silnika, sposób importu, kontrola danych, wynik odtworzenia i napotkane błędy.

Nie wytwarzaj zrzutu z ręcznie narysowaną tabelą jako dowodu zapytania. Zapisz widoczne polecenie i jego rzeczywisty rezultat; kadr ogranicz do aplikacji i wyników.

Jak ocenić własną pracę?

Sprawdź kolejno: prawidłowy schemat i import, właściwe kolumny i filtry, deterministyczny porządek, brak błędnego mnożenia wierszy w JOIN, poprawne NULL i agregację, ograniczony WHERE przy zmianach, działającą aplikację oraz udokumentowane odtworzenie. Wynik tekstowo podobny do rozwiązania nie wystarczy, jeśli zapytanie jest przypadkowo poprawne tylko dla małej próbki.

Porównania MySQL/MariaDB, SQL Server, Oracle i Access pomagają rozumieć różnice. Nie oznaczają, że wszystkie te dialekty są osobnym obowiązkowym zakresem egzaminu.

Mapa kursu do wymagań INF.03

Poniższe przyporządkowanie to organizacja dydaktyczna materiału, nie oficjalna lista lekcji CKE. Podstawa opisuje umiejętności; konkretne zadanie może łączyć kilka z nich.

Efekt / obszarLekcje
INF.03.4.12, 3, 4, 6
INF.03.4.23
INF.03.4.35
INF.03.4.41, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26
INF.03.4.56, 7, 8, 9, 26
INF.03.4.610, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 28, 29
INF.03.4.78, 23, 27
INF.03.4.825, 26, 27
INF.03.5.4–5 (pomost)5, 28, 29

Część 22 zawiera rozszerzenie o widoki, a 24 o transakcje i podstawy wydajności. Część 30 łączy materiał. Kurs obejmuje bazodanowy zakres kwalifikacji; HTML, CSS, JavaScript i pozostałe zagadnienia INF.03 wymagają osobnej nauki.

ORE: podstawa programowa technik informatyk, INF.03.4 · CKE: informator technik informatyk · CKE: wyposażenie INF.03 na lata 2027–2029

Przewijanie do góry