4.1 UPDATE SET-sats
Om du behöver ändra befintliga poster i tabellen använder vi operatorn för detta UPDATE
.
Å ena sidan UPDATE
liknar operatören operatören INSERT
, eftersom vi måste ange nya värden för kolumnerna. Och å andra sidan, på operatören, SELECT
eftersom det låter dig arbeta omedelbart med datagrupper.
Viktig! Syftet med operatören UPDATE
är att ändra data inte i en rad i tabellen, utan i alla rader som uppfyller ett visst villkor. Och om du gör ett litet misstag kan du lätt förlora all data i tabellen.
Allmän syn på begäran:
UPDATE table SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE condition;
Låt oss skriva en fråga som kommer att öka lönen för alla våra anställda med 100. Vår fråga kommer att se ut så här:
UPDATE employee SET
salary = salary+100;
Och nu för alla som har en lön på mindre än 50K kommer vi också att höja den med 20%. Exempel på begäran:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
Och naturligtvis kommer vi att öka direktörens lön med 2 gånger, hur kunde det vara utan honom:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 Komplexa scenarier för dataändring
Om du bestämmer dig för att ändra data i flera tabeller samtidigt, eller när du ändrar data i en tabell, måste du fylla den med data från en annan, eller helt enkelt på något sätt använda data från en annan tabell i processen att ändra den första, då väntar överraskningar på oss.
Låt oss försöka ändra nivån på alla användare i användartabellen som finns i personaltabellen. För enkelhetens skull kommer vi att kontrollera sammanträffandet av användare efter namn.
Hur skulle vi vilja skriva den här frågan:
UPDATE user SET
level = 80,
WHERE user . name IN ( list of names from employee table );
Nåväl, låt oss lägga till en lista med namn från personaltabellen till den här frågan:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
Intressant! Själva SQL-frågan för att få namnen visade sig vara ännu kortare än beskrivningen av uppgiften. Skaparna av SQL åt inte sitt bröd förgäves.
Tvingad att göra dig upprörd -detta tillvägagångssätt kommer inte att fungera. Först måste du gå med i dessa bord, det kommer att se ut ungefär så här:
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;
Låt oss göra det lite svårare. Du behöver bara sätta nivån till 80 för bra medarbetare vars lön kommer att vara mer än 50k. Den kompletta lösningen kommer att se ut så här:
UPDATE user, good_employees SET
user.level = 80
WHERE user.name = good_employees.name;
En sådan sammanfogning av tabeller är faktiskt INNER JOIN
, så att i slutändan kommer endast användare som har en matchning efter namn i den andra tabellen att finnas kvar.
Men vi måste fortfarande på något sätt välja bra medarbetare, så låt oss lägga till lite mer kod:
SELECT * FROM employee WHERE salary >= 50000
Och nu ersätter vi den här tabellen i vår sista fråga:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
Lev med det nu.
GO TO FULL VERSION