Teoria — kluczowe polecenia
INSERT INTO
Dodaje nowy rekord do tabeli. Wskazujesz kolumny i wartości — muszą pasować typem. Można wstawić wiele wierszy jednym poleceniem przez podanie wielu krotek VALUES.
UPDATE ... SET ... WHERE
Zmienia wartości w istniejących rekordach. ZAWSZE używaj WHERE — bez niego zmodyfikujesz WSZYSTKIE wiersze w tabeli!
DELETE FROM ... WHERE
Usuwa rekordy spełniające warunek. Bez WHERE usuniesz całą zawartość tabeli. Operacja jest nieodwracalna bez transakcji.
Transakcje: START · COMMIT · ROLLBACK
Grupują kilka operacji w jeden blok. COMMIT zatwierdza i utrwala zmiany. ROLLBACK cofa wszystkie operacje do punktu startu.
ON DELETE CASCADE
Opcja klucza obcego — po usunięciu rekordu nadrzędnego, powiązane rekordy podrzędne znikają automatycznie. Używaj świadomie!
Porównanie poleceń DML
Cykl życia transakcji
Baza danych: GameVault
Ta sama baza GameVault co w module 19. Jeśli nie masz jej jeszcze, wklej skrypt inicjujący z poprzedniej lekcji.
Ćwiczenia krok po kroku
Dodaj nowego gracza „CyberKing" z Polski. Następnie dodaj trzech graczy jednym poleceniem INSERT.
-- Dodanie jednego gracza
INSERT INTO gracze (nick, email, kraj)
VALUES ('CyberKing', 'king@gm.pl', 'PL');
-- Dodanie wielu graczy jednym INSERT
INSERT INTO gracze (nick, email, kraj) VALUES
('GhostRider', 'ghost@gm.us', 'US'),
('StarCraft99', 'star@gm.de', 'DE'),
('LagMaster', 'lag@gm.pl', 'PL');
-- Sprawdzenie
SELECT * FROM gracze;
Zmień nick gracza o gracz_id = 1 na „ShadowWolf_PL". Następnie podnieś ceny wszystkich gier RPG o 10%.
-- Najpierw sprawdź co zmieniasz
SELECT gracz_id, nick FROM gracze WHERE gracz_id = 1;
-- Zmiana nicka konkretnego gracza
UPDATE gracze
SET nick = 'ShadowWolf_PL'
WHERE gracz_id = 1;
-- Podwyżka cen wszystkich gier RPG o 10%
UPDATE gry
SET cena = cena * 1.10
WHERE gatunek = 'RPG';
-- Sprawdzenie
SELECT tytul, cena FROM gry WHERE gatunek = 'RPG';
Usuń wszystkich graczy z Niemiec (DE), którzy nie mają żadnych zakupów — "nieaktywnych" użytkowników.
-- Krok 1: Sprawdź co usuniesz (nigdy nie pomijaj!)
SELECT gracz_id, nick, kraj
FROM gracze
WHERE kraj = 'DE'
AND gracz_id NOT IN (
SELECT gracz_id FROM zakupy
);
-- Krok 2: Dopiero teraz usuń
DELETE FROM gracze
WHERE kraj = 'DE'
AND gracz_id NOT IN (
SELECT gracz_id FROM zakupy
);
W jednej transakcji: dodaj zakup gry „Portal 2" przez gracza „NeonByte" i zaktualizuj jego email. Jeśli wszystko się powiedzie — zatwierdź.
START TRANSACTION;
-- 1. Nowy zakup gry Portal 2 przez NeonByte
INSERT INTO zakupy (gracz_id, gra_id, data_zakupu, cena_zakupu)
VALUES (
(SELECT gracz_id FROM gracze WHERE nick = 'NeonByte'),
(SELECT gra_id FROM gry WHERE tytul = 'Portal 2'),
CURRENT_DATE,
39.99
);
-- 2. Aktualizacja emaila
UPDATE gracze
SET email = 'neonbyte_new@gm.us'
WHERE nick = 'NeonByte';
-- Wszystko OK — zatwierdzamy
COMMIT;
Zmień tymczasowo ceny wszystkich gier na 0 zł — a potem cofnij zmiany przez ROLLBACK. Udowodnij SELECT-em, że dane wróciły.
-- Stan przed zmianą
SELECT tytul, cena FROM gry;
START TRANSACTION;
-- "Błąd" — zerujemy wszystkie ceny
UPDATE gry SET cena = 0.00;
-- Wygląda źle...
SELECT tytul, cena FROM gry;
-- Cofamy wszystko!
ROLLBACK;
-- Ceny wróciły
SELECT tytul, cena FROM gry;
Odtwórz tabelę zakupy z opcją ON DELETE CASCADE. Usuń gracza — sprawdź, że jego zakupy zniknęły automatycznie.
DROP TABLE IF EXISTS zakupy;
CREATE TABLE zakupy (
zakup_id INT PRIMARY KEY AUTO_INCREMENT,
gracz_id INT,
gra_id INT,
data_zakupu DATE,
cena_zakupu DECIMAL(7,2),
FOREIGN KEY (gracz_id) REFERENCES gracze(gracz_id)
ON DELETE CASCADE,
FOREIGN KEY (gra_id) REFERENCES gry(gra_id)
);
-- Dodaj testowy zakup dla gracza_id=2
INSERT INTO zakupy (gracz_id, gra_id, data_zakupu, cena_zakupu)
VALUES (2, 2, '2024-12-01', 149.99);
-- Zakupy przed usunięciem
SELECT * FROM zakupy;
-- Usuń gracza — zakupy znikają automatycznie
DELETE FROM gracze WHERE gracz_id = 2;
-- Zakupów gracza 2 już nie ma
SELECT * FROM zakupy;
Zadanie projektowe
Operacje na danych GameVault
Wykonaj poniższe operacje na bazie GameVault. Każde polecenie opatrz komentarzem SQL (--). Zapisz do pliku .sql.
- 01Dodaj nową grę „Witcher 4" wydawcy CD Projekt, gatunek RPG, cena 249.99. Użyj podzapytania do pobrania wydawca_id.
- 02Zaktualizuj ceny wszystkich gier wydawcy „IndieSoft" — obniż o 20%. Sprawdź wynik SELECT-em.
- 03Usuń zakupy starsze niż 2024-12-31. Najpierw wyświetl je SELECT-em, potem usuń.
- 04W jednej transakcji: dodaj nowego gracza „TestUser" i natychmiast dodaj mu zakup gry „Portal 2". Zatwierdź przez COMMIT.
- 05Powtórz zadanie 04, ale zakończ ROLLBACK zamiast COMMIT. Udowodnij SELECT-em, że gracz nie został dodany.