Lekcja 6. DML — modyfikowanie danych (INSERT, UPDATE, DELETE)
PodstawowyPo co się tego uczymy?
Sama struktura tabel to za mało — baza danych ma sens dopiero wtedy, gdy można do niej wkładać, poprawiać i usuwać dane. Rejestracja nowego użytkownika, edycja profilu, usunięcie konta — to wszystko w tle wykonuje polecenia DML.
Teoria
W poprzedniej lekcji nauczyłeś się budować DDL-em "półki" — tabele. Teraz czas nauczyć się wkładać na nie, poprawiać i usuwać "książki" — czyli same dane. Do tego służy DML (ang. Data Manipulation Language).
INSERT — dodawanie nowych danych
Składnia:
INSERT INTO nazwa_tabeli (kolumna1, kolumna2, ...)
VALUES (wartosc1, wartosc2, ...);
Przykłady:
INSERT INTO Uczniowie (imie, nazwisko, id_klasy)
VALUES ('Jan', 'Kowalski', 1);
INSERT INTO Uczniowie (imie, nazwisko, id_klasy) VALUES
('Anna', 'Nowak', 2),
('Piotr', 'Zieliński', 1);
Drugi przykład pokazuje, że można wstawić kilka wierszy jednym poleceniem — wystarczy oddzielić je przecinkami.
UPDATE — zmiana istniejących danych
Składnia:
UPDATE nazwa_tabeli
SET kolumna1 = nowa_wartosc1, kolumna2 = nowa_wartosc2
WHERE warunek;
Przykłady:
UPDATE Uczniowie SET id_klasy = 2 WHERE id_ucznia = 1;
UPDATE Produkty SET cena = cena * 1.10 WHERE kategoria = 'Instrumenty';
Drugi przykład podnosi cenę o 10% wszystkim produktom z danej kategorii naraz.
DELETE — usuwanie danych
Składnia:
DELETE FROM nazwa_tabeli WHERE warunek;
Przykłady:
DELETE FROM Uczniowie WHERE id_ucznia = 5;
DELETE FROM Zamowienia WHERE data_zamowienia < '2020-01-01';
Bardzo ważna zasada bezpieczeństwa: UPDATE i DELETE BEZ klauzuli WHERE działają na WSZYSTKICH wierszach tabeli naraz. DELETE FROM Uczniowie; bez warunku usunie kompletnie wszystkich uczniów. Zawsze najpierw sprawdź warunek zwykłym SELECT, a dopiero potem zamień go na UPDATE/DELETE.
Przykład z życia
Za każdym razem, gdy klient w sklepie internetowym składa zamówienie, w tle wykonuje się INSERT. Gdy zmienia adres dostawy — UPDATE. Gdy anuluje zamówienie — DELETE (albo, w bardziej ostrożnych systemach, UPDATE ustawiający status na "anulowane", żeby nic nie znikało bezpowrotnie).
Kod (SQL)
CREATE TABLE Uczniowie (
id_ucznia INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50) NOT NULL,
nazwisko VARCHAR(50) NOT NULL,
id_klasy INT NOT NULL
);
-- dodajemy trzech uczniów jednym poleceniem
INSERT INTO Uczniowie (imie, nazwisko, id_klasy) VALUES
('Jan', 'Kowalski', 1),
('Anna', 'Nowak', 2),
('Piotr', 'Zieliński', 1);
-- Jan zmienia klasę
UPDATE Uczniowie SET id_klasy = 2 WHERE imie = 'Jan' AND nazwisko = 'Kowalski';
-- usuwamy jednego konkretnego ucznia po jego unikalnym id
DELETE FROM Uczniowie WHERE id_ucznia = 3;
-- sprawdzamy, co zostało w tabeli
SELECT * FROM Uczniowie;
Komentarz i wyjaśnienie kodu
Zwróć uwagę na warunek w UPDATE — używamy dwóch kolumn naraz (imie AND nazwisko), żeby mieć pewność, że zmieniamy dane właściwej osoby, a nie kogoś o tym samym imieniu. W DELETE celowo użyliśmy id_ucznia, czyli klucza głównego — to najbezpieczniejszy sposób wskazania DOKŁADNIE jednego wiersza, bo klucz główny nigdy się nie powtarza.
Ćwiczenie samodzielne
Uruchom kod z lekcji, a potem samodzielnie dopisz polecenie, które zmieni nazwisko Anny Nowak na "Kowalska", i drugie, które usunie ucznia o najniższym id_ucznia.
Zadania do pracy własnej
Zadanie 1. DML w sklepie muzycznym
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Sklep muzyczny (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Dodaj trzy nowe rekordy do tabeli Klienci.
- Dodaj dwa produkty do tabeli Produkty.
- Zmień miasto jednego klienta.
- Zwiększ ceny produktów z kategorii Akcesoria o 10%.
- Ustaw e-mail klientowi, który ma wartość NULL.
- Usuń zamówienie testowe o wskazanym id.
- Dodaj nowe zamówienie dla istniejącego klienta i produktu.
- Zmień stan magazynowy po sprzedaży produktu.
- Usuń produkty o stanie magazynowym równym 0.
- Sprawdź wynik zmian zapytaniem SELECT.
Zadanie 2. DML w aptece
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Apteka Zdrowie (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Dodaj trzy nowe rekordy do tabeli Klienci.
- Dodaj dwa produkty do tabeli Produkty.
- Zmień miasto jednego klienta.
- Zwiększ ceny produktów z kategorii Akcesoria o 10%.
- Ustaw e-mail klientowi, który ma wartość NULL.
- Usuń zamówienie testowe o wskazanym id.
- Dodaj nowe zamówienie dla istniejącego klienta i produktu.
- Zmień stan magazynowy po sprzedaży produktu.
- Usuń produkty o stanie magazynowym równym 0.
- Sprawdź wynik zmian zapytaniem SELECT.
Zadanie 3. DML w siłowni
Uwaga przed importem: plik z bazą jest spakowany jako
.gz. phpMyAdmin w XAMPP przyjmuje takie pliki bez rozpakowywania. Jeżeli po pobraniu nazwa wygląda np.sklep_muzyczny.sql_.gzi import nie przejdzie, zmień nazwę pliku nasklep_muzyczny.sql.gz, a potem wybierz go w zakładce Importuj.Baza do pracy: Siłownia FitZone (.sql.gz). Zaimportuj spakowany plik SQL w XAMPP/phpMyAdmin, a następnie wykonaj zapytania.
- Dodaj trzy nowe rekordy do tabeli Klienci.
- Dodaj dwa produkty do tabeli Produkty.
- Zmień miasto jednego klienta.
- Zwiększ ceny produktów z kategorii Akcesoria o 10%.
- Ustaw e-mail klientowi, który ma wartość NULL.
- Usuń zamówienie testowe o wskazanym id.
- Dodaj nowe zamówienie dla istniejącego klienta i produktu.
- Zmień stan magazynowy po sprzedaży produktu.
- Usuń produkty o stanie magazynowym równym 0.
- Sprawdź wynik zmian zapytaniem SELECT.
Typowe błędy
Najgroźniejszy błąd to zapomnienie klauzuli WHERE w UPDATE lub DELETE — wtedy operacja obejmuje WSZYSTKIE wiersze tabeli, co w prawdziwej bazie danych może oznaczać katastrofę. Drugi błąd to niedopasowana liczba kolumn i wartości w INSERT (np. 4 kolumny, ale 3 wartości) — SQL zgłosi błąd. Trzeci: zapominanie apostrofów wokół tekstu i dat w VALUES.
Nawiązanie do egzaminu zawodowego
DML to bezpośrednia realizacja efektu "stosuje polecenia języka SQL" i "zmienia/usuwa rekordy w bazie danych przy użyciu języka SQL" z INF.03.4 — w części praktycznej egzaminu regularnie trzeba zaimportować dane, a potem napisać zapytanie aktualizujące konkretne rekordy (np. podwyższenie ceny noclegu o 10%, tak jak w przykładowym zadaniu CKE).