4.1 UPDATE SET bildirimi

Tablodaki mevcut kayıtları değiştirmeniz gerekirse, bunun için operatörü kullanırız UPDATE.

Bir yandan operatör, UPDATEoperatöre benzer INSERT, çünkü sütunlar için yeni değerler belirlememiz gerekir. Öte yandan, operatör SELECT, çünkü veri gruplarıyla anında çalışmanıza izin verir.

Önemli! Operatörün amacı, UPDATEtablonun bir satırındaki verileri değil, belirli bir koşulu sağlayan tüm satırlardaki verileri değiştirmektir. Ve küçük bir hata yaparsanız, tablodaki tüm verileri kolayca kaybedebilirsiniz.

İsteğin genel görünümü:

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

Tüm çalışanlarımızın maaşını 100 artıracak bir sorgu yazalım. Sorgumuz şöyle görünecek:

UPDATE employee SET
  	salary = salary+100;

Ve şimdi maaşı 50 binin altında olan herkes için de %20 zam yapacağız. Örnek talep:

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

Ve tabii ki yönetmenin maaşını 2 kat artıracağız, onsuz nasıl olabilir:

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

4.2 Karmaşık veri değişikliği senaryoları

Aynı anda birkaç tablodaki verileri değiştirmeye karar verirseniz veya bir tablodaki verileri değiştirdiğinizde, onu başka bir tablodaki verilerle doldurmanız veya bir şekilde ilkini değiştirme sürecinde başka bir tablodaki verileri kullanmanız gerekir. sonra sürprizler bizi bekliyor.

Çalışan tablosunda bulunan kullanıcı tablosundaki tüm kullanıcıların seviyesini değiştirmeye çalışalım. Basitlik için, kullanıcıların tesadüflerini isme göre kontrol edeceğiz.

Bu sorguyu nasıl yazmak isteriz:

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

Peki, bu sorguya çalışan tablosundan bir isim listesi ekleyelim:

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

İlginç! İsimleri almak için SQL sorgusunun kendisinin görev açıklamasından bile daha kısa olduğu ortaya çıktı. SQL'in yaratıcıları ekmeklerini boşuna yemediler.

Seni üzmek zorunda kaldım -bu yaklaşım işe yaramayacak. Öncelikle bu tablolara katılmanız gerekiyor, şöyle görünecek:

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;

Hadi biraz daha zorlaştıralım. Sadece maaşı 50 binden fazla olacak iyi çalışanlar için seviyeyi 80 olarak ayarlamanız gerekir. Tam çözüm şöyle görünecektir:

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

Tabloların böyle bir birleştirilmesi aslında INNER JOIN, yani sonunda yalnızca ikinci tabloda ada göre eşleşmesi olan kullanıcılar kalacak.

Ama yine de bir şekilde iyi çalışanları seçmemiz gerekiyor, bu yüzden biraz daha kod ekleyelim:

SELECT * FROM employee WHERE salary >= 50000

Ve şimdi bu tabloyu son sorgumuzda değiştiriyoruz:

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

Şimdi onunla yaşa.