4.1 UPDATE SET-setning
Hvis du trenger å endre eksisterende poster i tabellen, bruker vi operatøren til dette UPDATE
.
UPDATE
På 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 UPDATE
er å 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å.
GO TO FULL VERSION