Zapytanie INSTERT i UPDATE

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);