Wprowadzenie do poleceń INSERT i UPDATE w MySQL
SQL pozwala na manipulowanie danymi w bazie za pomocą różnych instrukcji. Dwie kluczowe operacje to INSERT, służące do dodawania nowych danych do tabeli, oraz UPDATE, które umożliwia modyfikację istniejących rekordów. W tej lekcji szczegółowo omówimy oba polecenia, ich składnię, zastosowania i możliwe błędy.
1. INSERT – dodawanie danych do tabeli
Instrukcja INSERT INTO
pozwala na dodanie nowych rekordów do tabeli. Możemy to zrobić na kilka sposobów:
Podstawowa składnia:
INSERT INTO nazwa_tabeli (kolumna1, kolumna2, kolumna3, ...)
VALUES (wartość1, wartość2, wartość3, ...);
Przykład:
INSERT INTO klienci (id, imie, nazwisko, email)
VALUES (1, 'Jan', 'Kowalski', 'jan.kowalski@example.com');
Dodaje nowego klienta do tabeli klienci
.
Dodawanie wielu rekordów jednocześnie
Możemy dodać więcej niż jeden rekord w jednym zapytaniu:
INSERT INTO klienci (id, imie, nazwisko, email)
VALUES
(2, 'Anna', 'Nowak', 'anna.nowak@example.com'),
(3, 'Piotr', 'Zielinski', 'piotr.zielinski@example.com');
Pomijanie niektórych kolumn
Jeśli jakaś kolumna ma ustawioną wartość domyślną lub jest AUTO_INCREMENT
, możemy ją pominąć:
INSERT INTO klienci (imie, nazwisko, email)
VALUES ('Krzysztof', 'Malinowski', 'krzysztof.malinowski@example.com');
MySQL automatycznie przypisze wartość do pominiętego id
(jeśli jest AUTO_INCREMENT
).
Wstawianie danych z innej tabeli
Możemy skopiować dane z jednej tabeli do drugiej:
INSERT INTO archiwum_klientow (id, imie, nazwisko, email)
SELECT id, imie, nazwisko, email FROM klienci WHERE id > 100;
Przenosi klientów o id > 100
do tabeli archiwum_klientow
.
2. UPDATE – aktualizacja danych w tabeli
Instrukcja UPDATE
pozwala na modyfikację istniejących rekordów w bazie danych.
Podstawowa składnia
UPDATE nazwa_tabeli
SET kolumna1 = wartość1, kolumna2 = wartość2
WHERE warunek;
Przykład:
UPDATE klienci
SET email = 'nowy.email@example.com'
WHERE id = 1;
Zmienia adres e-mail klienta o id = 1
.
Modyfikacja wielu kolumn jednocześnie
UPDATE klienci
SET imie = 'Tomasz', nazwisko = 'Kowal'
WHERE id = 2;
Zmienia zarówno imię, jak i nazwisko klienta o id = 2
.
Aktualizacja wielu rekordów jednocześnie
UPDATE klienci
SET status = 'aktywny'
WHERE status = 'nieaktywny';
Zmienia status wszystkich klientów z nieaktywny
na aktywny
.
Aktualizacja na podstawie danych z innej tabeli
UPDATE klienci k
JOIN zamowienia z ON k.id = z.klient_id
SET k.status = 'aktywny'
WHERE z.data_zamowienia > '2024-01-01';
Ustawia status aktywny
dla klientów, którzy złożyli zamówienie po 2024-01-01
.
Ostrożność w użyciu UPDATE
Zawsze używaj klauzuli WHERE
, ponieważ jeśli jej zabraknie, zaktualizowane zostaną wszystkie rekordy w tabeli:
UPDATE klienci
SET status = 'nowy';
Powyższe zapytanie zmieni status wszystkich klientów.
Ćwiczenia – INSERT
Ćwiczenie 1:
Wstaw do tabeli produkty
trzy nowe produkty z nazwami, cenami i kategoriami. Jeden z nich powinien należeć do kategorii Elektronika
, drugi do Odzież
, a trzeci do Sport
.
Ćwiczenie 2:
Wstaw do tabeli zamowienia
dwa rekordy, w których klienci o różnych id
zamówili ten sam produkt. Podaj liczbę sztuk i datę zamówienia.
Ćwiczenie 3:
Wstaw do tabeli klienci
nowego klienta, ale nie podawaj jego id
, aby baza danych automatycznie je wygenerowała.
Ćwiczenie 4:
Dodaj do tabeli zamowienia
wszystkie zamówienia klientów, którzy mają status nowy
, kopiując ich dane z tabeli koszyk
.
Ćwiczenie 5:
Spróbuj wstawić nowy rekord do tabeli klienci
, używając INSERT
, ale nie podając wartości dla kolumny email
, która ma ograniczenie NOT NULL
. Sprawdź, jaki błąd zwróci MySQL.
Ćwiczenie 6:
Utwórz tabelę archiwum_zamowien
i skopiuj do niej zamówienia starsze niż rok.
Ćwiczenia – UPDATE
Ćwiczenie 7:
Zmień status klienta o id = 5
na premium
.
Ćwiczenie 8:
Zwiększ cenę wszystkich produktów w kategorii Elektronika
o 10%.
Ćwiczenie 9:
Dla wszystkich klientów, którzy nie złożyli zamówienia w ciągu ostatnich dwóch lat, ustaw status nieaktywny
.
Ćwiczenie 10:
Zmodyfikuj tabelę zamowienia
, aby dla wszystkich zamówień złożonych w styczniu 2024 zmienić status na w realizacji
.
Ćwiczenie 11:
Zmień adres e-mail klientów, którzy mają adres kończący się na @oldmail.com
, na @newmail.com
.
Ćwiczenie 12:
Połącz tabelę klienci
z tabelą zamowienia
i ustaw status aktywny
dla wszystkich klientów, którzy mają co najmniej jedno zamówienie.
Dane do bazy:
-- Tabela klientów
CREATE TABLE klienci (
id INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50) NOT NULL,
nazwisko VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
status ENUM('nowy', 'aktywny', 'nieaktywny', 'premium') DEFAULT 'nowy'
);
-- Tabela produktów
CREATE TABLE produkty (
id INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(100) NOT NULL,
cena DECIMAL(10,2) NOT NULL,
kategoria ENUM('Elektronika', 'Odziez', 'Sport', 'AGD', 'Inne') NOT NULL
);
-- Tabela zamówień
CREATE TABLE zamowienia (
id INT AUTO_INCREMENT PRIMARY KEY,
klient_id INT NOT NULL,
produkt_id INT NOT NULL,
liczba_sztuk INT NOT NULL CHECK (liczba_sztuk > 0),
data_zamowienia DATE NOT NULL,
status ENUM('oczekujace', 'w realizacji', 'wyslane', 'zakonczone') DEFAULT 'oczekujace',
FOREIGN KEY (klient_id) REFERENCES klienci(id),
FOREIGN KEY (produkt_id) REFERENCES produkty(id)
);
-- Tabela koszyka (dla klientów, którzy jeszcze nie złozyli zamówienia)
CREATE TABLE koszyk (
id INT AUTO_INCREMENT PRIMARY KEY,
klient_id INT NOT NULL,
produkt_id INT NOT NULL,
liczba_sztuk INT NOT NULL CHECK (liczba_sztuk > 0),
FOREIGN KEY (klient_id) REFERENCES klienci(id),
FOREIGN KEY (produkt_id) REFERENCES produkty(id)
);
-- Tabela archiwum zamówień
CREATE TABLE archiwum_zamowien (
id INT AUTO_INCREMENT PRIMARY KEY,
klient_id INT,
produkt_id INT,
liczba_sztuk INT,
data_zamowienia DATE,
status ENUM('oczekujace', 'w realizacji', 'wyslane', 'zakonczone')
);
-- Wstawianie danych:
-- Dodanie klientow
INSERT INTO klienci (imie, nazwisko, email, status) VALUES
('Jan', 'Kowalski', 'jan.kowalski@example.com', 'aktywny'),
('Anna', 'Nowak', 'anna.nowak@example.com', 'nowy'),
('Piotr', 'Zielinski', 'piotr.zielinski@example.com', 'premium'),
('Krzysztof', 'Malinowski', 'krzysztof.malinowski@example.com', 'nieaktywny'),
('Magda', 'Lewandowska', 'magda.lewandowska@example.com', 'aktywny');
-- Dodanie produktow
INSERT INTO produkty (nazwa, cena, kategoria) VALUES
('Smartfon X', 2999.99, 'Elektronika'),
('Laptop Y', 4999.99, 'Elektronika'),
('Koszulka sportowa', 99.99, 'Odziez'),
('Hantle 10kg', 149.99, 'Sport'),
('Odkurzacz Turbo', 799.99, 'AGD');
-- Dodanie zamowien
INSERT INTO zamowienia (klient_id, produkt_id, liczba_sztuk, data_zamowienia, status) VALUES
(1, 1, 1, '2024-02-15', 'oczekujace'),
(2, 2, 1, '2024-03-01', 'w realizacji'),
(3, 3, 2, '2023-12-20', 'zakonczone'),
(4, 4, 1, '2022-11-10', 'zakonczone'),
(5, 5, 1, '2024-01-10', 'wyslane');
-- Dodanie rekordow do koszyka (klienci, ktorzy jeszcze nie zlozyli zamowienia)
INSERT INTO koszyk (klient_id, produkt_id, liczba_sztuk) VALUES
(2, 1, 1),
(4, 3, 2);