4.1 Instrukcja UPDATE SET
Jeśli chcesz zmienić istniejące rekordy w tabeli, użyjemy do tego operatora UPDATE
.
Z jednej strony operator UPDATE
jest podobny do operatora INSERT
, ponieważ musimy podać nowe wartości dla kolumn. A z drugiej strony na operatorze SELECT
, ponieważ pozwala on na natychmiastową pracę z grupami danych.
Ważny! Celem operatora UPDATE
jest zmiana danych nie w jednym wierszu tabeli, ale we wszystkich wierszach spełniających określony warunek. A jeśli popełnisz mały błąd, możesz łatwo stracić wszystkie dane w tabeli.
Ogólny widok wniosku:
UPDATE table SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE condition;
Napiszmy zapytanie, które zwiększy pensję wszystkich naszych pracowników o 100. Nasze zapytanie będzie wyglądać tak:
UPDATE employee SET
salary = salary+100;
A teraz dla każdego , kto ma pensję mniejszą niż 50 000, zwiększymy ją również o 20%. Przykład żądania:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
I oczywiście podniesiemy pensję dyrektora 2 razy, jak by to było bez niego:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 Złożone scenariusze modyfikacji danych
Jeśli zdecydujesz się na zmianę danych w kilku tabelach jednocześnie lub gdy zmienisz dane w jednej tabeli, musisz wypełnić ją danymi z innej tabeli lub po prostu w jakiś sposób wykorzystać dane z innej tabeli w procesie zmiany pierwszej, potem czekają na nas niespodzianki.
Spróbujmy zmienić poziom wszystkich użytkowników w tabeli użytkowników, którzy istnieją w tabeli pracowników. Dla uproszczenia sprawdzimy zbieżność użytkowników według nazwy.
Jak chcielibyśmy napisać to zapytanie:
UPDATE user SET
level = 80,
WHERE user . name IN ( list of names from employee table );
Cóż, dodajmy listę nazwisk z tabeli pracowników do tego zapytania:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
Ciekawy! Samo zapytanie SQL w celu uzyskania nazw okazało się nawet krótsze niż opis zadania. Twórcy SQL nie jedli chleba na próżno.
Zmuszony cię zdenerwować -takie podejście nie zadziała. Najpierw musisz dołączyć do tych tabel, będzie to wyglądać mniej więcej tak:
UPDATE table 1, table 2 SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE table 1.id = table 2.ref_id;
Utrudnijmy to trochę. Poziom 80 musisz ustawić tylko dla dobrych pracowników, których pensja przekroczy 50 tys. Kompletne rozwiązanie będzie wyglądać następująco:
UPDATE user, good_employees SET
user.level = 80
WHERE user.name = good_employees.name;
Takie łączenie tabel jest w rzeczywistości INNER JOIN
, tak że ostatecznie pozostaną tylko użytkownicy, którzy mają dopasowanie według nazwy w drugiej tabeli.
Ale nadal musimy jakoś wybrać dobrych pracowników, więc dodajmy trochę więcej kodu:
SELECT * FROM employee WHERE salary >= 50000
A teraz zastępujemy tę tabelę w naszym ostatnim zapytaniu:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
Żyj z tym teraz.