4.1 UPDATE SET-sats

Om du behöver Àndra befintliga poster i tabellen anvÀnder vi operatorn för detta UPDATE.

Å ena sidan UPDATEliknar operatören operatören INSERT, eftersom vi mĂ„ste ange nya vĂ€rden för kolumnerna. Och Ă„ andra sidan, pĂ„ operatören, SELECTeftersom 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.