4.1 UPDATE SET-verklaring
Als u bestaande records in de tabel moet wijzigen, gebruiken we hiervoor de operator UPDATE
.
Aan de ene kant is de operator UPDATE
vergelijkbaar met de operator INSERT
, omdat we nieuwe waarden voor de kolommen moeten specificeren. En aan de andere kant aan de operator SELECT
, omdat je daarmee direct met datagroepen kunt werken.
Belangrijk! Het doel van de operator UPDATE
is om de gegevens niet in één rij van de tabel te wijzigen, maar in alle rijen die aan een bepaalde voorwaarde voldoen. En als je een klein foutje maakt, kun je gemakkelijk alle gegevens in de tabel kwijtraken.
Algemeen beeld van de aanvraag:
UPDATE table SET
column 1 = expression 1,
column 2 = expression 2,
column 3 = expression 3
WHERE condition;
Laten we een query schrijven die het salaris van al onze werknemers met 100 verhoogt. Onze query ziet er als volgt uit:
UPDATE employee SET
salary = salary+100;
En nu voor iedereen die een salaris heeft van minder dan 50K gaan we dat ook met 20% verhogen. Voorbeeld aanvragen:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
En natuurlijk verhogen we het salaris van de directeur met 2 keer, hoe zou het kunnen zonder hem:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 Complexe scenario's voor gegevensverandering
Als u besluit gegevens in verschillende tabellen tegelijkertijd te wijzigen, of als u gegevens in één tabel wijzigt, moet u deze vullen met gegevens uit een andere tabel, of gewoon op de een of andere manier gegevens uit een andere tabel gebruiken tijdens het wijzigen van de eerste, dan wachten ons verrassingen.
Laten we proberen het niveau te wijzigen van alle gebruikers in de gebruikerstabel die bestaan in de werknemerstabel. Voor de eenvoud zullen we het samenvallen van gebruikers op naam controleren.
Hoe zouden we deze query willen schrijven:
UPDATE user SET
level = 80,
WHERE user . name IN ( list of names from employee table );
Laten we een lijst met namen uit de werknemerstabel aan deze query toevoegen:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
Interessant! De SQL-query zelf om de namen te krijgen bleek zelfs korter te zijn dan de beschrijving van de taak. De makers van SQL hebben hun brood niet voor niets gegeten.
Gedwongen om je van streek te maken -deze aanpak zal niet werken. Eerst moet je aan deze tabellen deelnemen, het ziet er ongeveer zo uit:
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;
Laten we het wat moeilijker maken. U hoeft het niveau alleen op 80 in te stellen voor goede werknemers met een salaris van meer dan 50.000. De volledige oplossing ziet er als volgt uit:
UPDATE user, good_employees SET
user.level = 80
WHERE user.name = good_employees.name;
Zo'n samenvoeging van tabellen is eigenlijk INNER JOIN
, zodat uiteindelijk alleen gebruikers overblijven die op naam een match hebben in de tweede tabel.
Maar we moeten nog steeds op de een of andere manier goede werknemers selecteren, dus laten we wat meer code toevoegen:
SELECT * FROM employee WHERE salary >= 50000
En nu vervangen we deze tabel in onze laatste query:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
Leef er nu mee.