4.1 UPDATE SET-setning

Hvis du trenger å endre eksisterende poster i tabellen, bruker vi operatøren til dette UPDATE.

UPDATEPå den ene siden ligner operatøren operatøren INSERT, fordi vi må spesifisere nye verdier for kolonnene. Og på den annen side, på operatøren SELECT, fordi den lar deg jobbe umiddelbart med datagrupper.

Viktig! Hensikten med operatøren UPDATEer å endre dataene ikke i én rad i tabellen, men i alle rader som oppfyller en bestemt betingelse. Og hvis du gjør en liten feil, kan du lett miste alle dataene i tabellen.

Generelt syn på forespørselen:

UPDATE table SET
  	column 1 = expression 1,
  	column 2 = expression 2,
  	column 3 = expression 3
WHERE condition;

La oss skrive en forespørsel som vil øke lønnen til alle våre ansatte med 100. Vår forespørsel vil se slik ut:

UPDATE employee SET
  	salary = salary+100;

Og nå for alle som har en lønn på under 50K, vil vi også øke den med 20%. Eksempel på forespørsel:

UPDATE employee SET
  	salary = salary*1.2
WHERE salary<50000;

Og selvfølgelig vil vi øke lønnen til direktøren med 2 ganger, hvordan kunne det vært uten ham:

UPDATE employee SET
  	salary = salary*2
WHERE id=4;

4.2 Komplekse dataendringsscenarier

Hvis du bestemmer deg for å endre data i flere tabeller samtidig, eller når du endrer data i en tabell, må du fylle den med data fra en annen, eller bare på en eller annen måte bruke data fra en annen tabell i prosessen med å endre den første, da venter overraskelser på oss.

La oss prøve å endre nivået til alle brukerne i brukertabellen som finnes i ansatttabellen. For enkelhets skyld vil vi sjekke tilfeldighetene til brukere ved navn.

Hvordan vil vi skrive denne spørringen:

UPDATE user SET
  	level = 80,
WHERE user . name IN ( list of names from employee table );

Vel, la oss legge til en liste over navn fra ansatttabellen til denne spørringen:

UPDATE user SET
  	level = 80,
WHERE user.name IN (select name from employee);

Interessant! Selve SQL-spørringen for å få navnene viste seg å være enda kortere enn beskrivelsen av oppgaven. Skaperne av SQL spiste ikke brødet sitt forgjeves.

Tvunget til å opprøre deg -denne tilnærmingen vil ikke fungere. Først må du bli med i disse tabellene, det vil se omtrent slik ut:

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;

La oss gjøre det litt vanskeligere. Du må sette nivået til 80 bare for gode ansatte hvis lønn vil være mer enn 50k. Den komplette løsningen vil se slik ut:

UPDATE user, good_employees SET
  	user.level = 80
WHERE user.name = good_employees.name;

En slik sammenføyning av tabeller er faktisk INNER JOIN, slik at det til slutt bare vil være igjen brukere som har en match etter navn i den andre tabellen.

Men vi må fortsatt velge gode ansatte på en eller annen måte, så la oss legge til litt mer kode:

SELECT * FROM employee WHERE salary >= 50000

Og nå erstatter vi denne tabellen i vår siste spørring:

UPDATE user,
    (SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
    user.level = 80
WHERE user.name = good_emps.name;

Lev med det nå.