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