4.1 Instrucțiunea UPDATE SET

Dacă trebuie să modificați înregistrările existente în tabel, atunci pentru aceasta folosim operatorul UPDATE.

Pe de o parte, operatorul UPDATEeste similar cu operatorul INSERT, deoarece trebuie să specificăm noi valori pentru coloane. Și pe de altă parte, pe operator SELECT, pentru că vă permite să lucrați imediat cu grupuri de date.

Important! Scopul operatorului UPDATEeste de a modifica datele nu într-un rând al tabelului, ci în toate rândurile care îndeplinesc o anumită condiție. Și dacă faci o mică greșeală, poți pierde cu ușurință toate datele din tabel.

Vedere generală a cererii:

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

Să scriem o interogare care va crește salariul tuturor angajaților noștri cu 100. Interogarea noastră va arăta astfel:

UPDATE employee SET
  	salary = salary+100;

Și acum pentru toți cei care au un salariu mai mic de 50K, îl vom crește și noi cu 20%. Exemplu de solicitare:

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

Și, desigur, vom crește salariul directorului de 2 ori, cum ar putea fi fără el:

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

4.2 Scenarii complexe de modificare a datelor

Dacă decideți să modificați datele din mai multe tabele în același timp sau când modificați datele dintr-un tabel, trebuie să îl completați cu date dintr-un altul sau pur și simplu să utilizați cumva datele dintr-un alt tabel în procesul de modificare a primului tabel, atunci ne așteaptă surprize.

Să încercăm să schimbăm nivelul tuturor utilizatorilor din tabelul de utilizatori care există în tabelul de angajați. Pentru simplitate, vom verifica coincidența utilizatorilor după nume.

Cum am dori să scriem această interogare:

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

Ei bine, haideți să adăugăm o listă de nume din tabelul angajaților la această interogare:

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

Interesant! Interogarea SQL în sine pentru obținerea numelor s-a dovedit a fi chiar mai scurtă decât descrierea sarcinii. Creatorii SQL nu și-au mâncat pâinea degeaba.

Forțat să te supere -această abordare nu va funcționa. Mai întâi trebuie să vă alăturați acestor mese, va arăta cam așa:

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;

Să facem un pic mai dificil. Trebuie să setați nivelul la 80 doar pentru angajații buni al căror salariu va fi mai mare de 50k. Soluția completă va arăta astfel:

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

O astfel de îmbinare a tabelelor este de fapt INNER JOIN, astfel încât în ​​final vor rămâne doar utilizatorii care au o potrivire după nume în al doilea tabel.

Dar mai trebuie să selectăm cumva angajați buni, așa că haideți să mai adăugăm ceva cod:

SELECT * FROM employee WHERE salary >= 50000

Și acum înlocuim acest tabel în interogarea noastră finală:

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

Trăiește cu ea acum.