Ćwiczenia SQL – INF.03

1. Składnia poleceń SQL (DDL, DML, DCL)

SQL to język komunikacji z bazą danych. Nie jest to język programowania, tylko zestaw poleceń, które opisują: co ma powstać, jakie dane zapisać i kto ma do nich dostęp. Na egzaminie bardzo często pytania opierają się właśnie na podziale SQL na grupy poleceń.
DDL – tworzy i usuwa strukturę (bazy, tabele)
DML – operuje na danych (dodaje, zmienia, usuwa rekordy)
DCL – zarządza dostępem użytkowników
CREATE DATABASE szkola;
USE szkola;
Pierwsza linia zakłada nową bazę danych. Druga ustawia ją jako aktualnie używaną, bez tego kolejne polecenia nie wiedziałyby, gdzie mają trafić.
CREATE TABLE uczniowie (
  id INT AUTO_INCREMENT PRIMARY KEY,
  imie VARCHAR(30),
  nazwisko VARCHAR(30)
);
Każda tabela powinna mieć klucz główny. AUTO_INCREMENT sprawia, że baza sama nadaje kolejne numery rekordom, co jest standardem na egzaminie.
INSERT INTO uczniowie (imie, nazwisko)
VALUES ('Jan', 'Kowalski'), ('Anna', 'Nowak');
INSERT zapisuje dane do tabeli. W jednej instrukcji można dodać wiele rekordów, co skraca kod i przyspiesza działanie bazy.
CREATE USER 'uczen'@'localhost' IDENTIFIED BY '1234';
GRANT SELECT, INSERT ON szkola.* TO 'uczen'@'localhost';
Najpierw tworzony jest użytkownik bazy, a potem nadawane są mu konkretne prawa. Na egzaminie często sprawdzane jest, czy uczeń potrafi odróżnić CREATE USER od GRANT.
DROP DATABASE IF EXISTS test;
IF EXISTS zabezpiecza przed błędem, jeśli baza nie istnieje. To dobra praktyka w skryptach.
Jak to wygląda na egzaminie?
W poleceniach pojawiają się często sformułowania: „utwórz bazę danych”, „zdefiniuj tabele” lub „uzupełnij skrypt tworzący bazę”. To są zadania z grupy DDL. Dodawanie przykładowych rekordów do tabeli to już typowe polecenia z grupy DML.
Uwaga egzaminacyjna:
– pomylenie CREATE TABLE z INSERT INTO to częsty błąd
– brak PRIMARY KEY w tabeli zwykle oznacza utratę punktów
– DROP DATABASE bez IF EXISTS może zakończyć skrypt błędem

2. Tworzenie struktury bazy danych

Dobrze zaprojektowana baza danych to taka, która pilnuje poprawności danych sama z siebie. Służą do tego klucze oraz ograniczenia.
CREATE TABLE klasy (
  id INT AUTO_INCREMENT PRIMARY KEY,
  symbol VARCHAR(10) UNIQUE,
  wychowawca VARCHAR(50)
);
UNIQUE gwarantuje, że symbol klasy się nie powtórzy. Baza zablokuje próbę wstawienia duplikatu.
CREATE TABLE uczniowie (
  id INT AUTO_INCREMENT PRIMARY KEY,
  imie VARCHAR(30),
  nazwisko VARCHAR(30),
  id_klasy INT,
  FOREIGN KEY (id_klasy) REFERENCES klasy(id)
);
FOREIGN KEY tworzy relację między tabelami. Nie da się przypisać ucznia do klasy, która nie istnieje w tabeli klasy.
Zanim dodasz klucz obcy, zadaj sobie pytanie: czy w tej tabeli naprawdę muszę przechowywać dodatkowe dane, czy wystarczy powiązanie z inną tabelą? Jeżeli dane się powtarzają (np. nazwy klas), to znak, że powinny trafić do osobnej tabeli i zostać połączone kluczem obcym.
ALTER TABLE uczniowie
ADD CONSTRAINT srednia_check CHECK (srednia BETWEEN 1 AND 6);
CHECK pilnuje zakresu wartości. Jeśli ktoś spróbuje wpisać 7, baza odrzuci taki rekord.
ALTER TABLE uczniowie ADD COLUMN data_urodzenia DATE;
ALTER TABLE pozwala zmieniać strukturę tabeli bez usuwania danych.
Zadanie:
W tabeli uczniowie chcesz dodać kolumnę plec, która może przyjmować tylko wartości 'K' lub 'M'.
Zapisz polecenie ALTER TABLE z odpowiednim ograniczeniem CHECK.
ALTER TABLE uczniowie
ADD COLUMN plec CHAR(1),
ADD CONSTRAINT plec_check CHECK (plec IN ('K','M'));
Jak to wygląda w zadaniu egzaminacyjnym?
Bardzo często dostajesz opis w stylu: „Średnia ocen ucznia zawiera się w przedziale od 1 do 6”. Jeśli widzisz taki zakres w treści, to prawie zawsze możesz za to dostać punkt, dodając odpowiedni CHECK w tabeli.

3. Wyszukiwanie informacji (SELECT)

SELECT to najczęściej używane polecenie SQL. Na egzaminie zawsze pojawia się w kilku wariantach: z warunkiem, sortowaniem i łączeniem tabel.
SELECT * FROM uczniowie;
Gwiazdkę stosujemy głównie do testów. W praktyce lepiej wybierać konkretne kolumny.
SELECT imie, nazwisko FROM uczniowie WHERE id_klasy = 1;
WHERE filtruje dane. Bez niego zapytanie zwróci wszystkie rekordy.
WHERE działa jak filtr. Jeżeli go nie użyjesz, baza zwróci wszystkie rekordy. Na egzaminie brak WHERE to jeden z najczęstszych powodów utraty punktów przy zapytaniach.
SELECT uczniowie.imie, uczniowie.nazwisko, klasy.symbol
FROM uczniowie
JOIN klasy ON uczniowie.id_klasy = klasy.id;
JOIN pozwala pobrać dane z wielu tabel naraz. To jeden z kluczowych tematów INF.03.
Zanim napiszesz JOIN, zadaj sobie pytanie: czy wszystkie potrzebne dane są w jednej tabeli? Jeśli nie, musisz je połączyć. Dlatego JOIN pojawia się od razu po FROM, a warunek łączenia zawsze trafia do ON.
W tym miejscu wiele osób próbuje zmieścić wszystko w jednej tabeli i jednym SELECT bez JOIN. Działa to tylko przy bardzo prostych bazach, ale na egzaminie prawie zawsze pojawiają się co najmniej dwie powiązane tabele.
Zadanie:
Wyświetl imię i nazwisko uczniów, którzy należą do klasy o symbolu „4TI”.
SELECT uczniowie.imie, uczniowie.nazwisko
FROM uczniowie
JOIN klasy ON uczniowie.id_klasy = klasy.id
WHERE klasy.symbol = '4TI';
Jak to wygląda w zadaniu egzaminacyjnym?
Najczęściej dostajesz gotową bazę i polecenie w stylu: „Wyświetl listę uczniów wraz z symbolami klas”. Jeżeli w wyniku mają być dane z dwóch tabel, to prawie na pewno trzeba użyć JOIN.
Uwaga egzaminacyjna:
– brak aliasów tabel jest poprawny, ale obniża czytelność kodu
– SELECT * jest akceptowalny, o ile treść zadania nie prosi o konkretne kolumny
– literówka w nazwie kolumny zwykle oznacza 0 punktów za całe zapytanie

4. Modyfikacja danych i transakcje

Operacje na danych są nieodwracalne, dlatego w poważnych systemach stosuje się transakcje.
START TRANSACTION;
UPDATE uczniowie SET id_klasy = 2 WHERE id = 3;
COMMIT;
COMMIT zatwierdza zmiany na stałe. Po nim nie da się już cofnąć operacji.
START TRANSACTION;
DELETE FROM uczniowie WHERE id_klasy = 2;
ROLLBACK;
ROLLBACK cofa wszystkie zmiany wykonane od momentu rozpoczęcia transakcji.
To polecenie wygląda niewinnie, ale użyte bez zastanowienia potrafi wyczyścić całą tabelę. Dlatego dobrą praktyką jest najpierw napisać SELECT z takim samym WHERE, a dopiero potem zamienić SELECT na UPDATE lub DELETE.
Zadanie:
Zmień wszystkim uczniom z klasy o symbolu „3A” numer klasy na „4A” w ramach jednej transakcji. Jeśli coś pójdzie nie tak, zmiany mają zostać cofnięte.
START TRANSACTION;
UPDATE uczniowie
JOIN klasy ON uczniowie.id_klasy = klasy.id
SET uczniowie.id_klasy = (
  SELECT id FROM klasy WHERE symbol = '4A'
)
WHERE klasy.symbol = '3A';
-- jeśli wszystko OK:
COMMIT;
-- jeśli coś jest nie tak, zamiast COMMIT użyj:
-- ROLLBACK;
Częsty błąd:
UPDATE lub DELETE bez WHERE modyfikuje wszystkie rekordy w tabeli. Na egzaminie traktowane jest to jako błąd krytyczny i najczęściej kończy się utratą punktów za całe polecenie.

5. Skrypty SQL i automatyzacja

Skrypt SQL to plik, który potrafi odtworzyć całą bazę od zera. Na egzaminie często pracujesz właśnie na takim gotowym skrypcie.
CREATE VIEW IT_Pracownicy
AS SELECT * FROM pracownicy WHERE dzial='IT';
Widok działa jak zapamiętane zapytanie. Ułatwia pracę i poprawia czytelność kodu.
Jak to wygląda w zadaniu egzaminacyjnym?
W treści możesz spotkać polecenie: „Utwórz widok zawierający pracowników działu IT i zapisz go pod nazwą IT_Pracownicy”. Skoro nazwa widoku jest podana dosłownie, to musi zostać użyta dokładnie w takiej formie, łącznie z wielkością liter, jeśli system ją rozróżnia.