4.1 UPDATE SET operatori
Agar jadvaldagi mavjud yozuvlarni o'zgartirish kerak bo'lsa, biz UPDATE operatoridan foydalanamiz.
Bir tomondan, UPDATE operatori INSERT operatoriga o'xshaydi, chunki biz kolonkalarga yangi qiymatlar ko'rsatishimiz kerak bo'ladi. Boshqa tomondan esa, SELECT operatoriga o'xshaydi, chunki u bizga ma'lumotlar guruhlari bilan birga ishlash imkoniyatini beradi.
Muuhim! UPDATE operatorining maqsadi—jadvalning bir qatori emas, balki ma'lum shartga mos keladigan barcha qatorlaridagi ma'lumotlarni o'zgartirishdir. Agar kichik bir xato qilsangiz, jadvaldagi barcha ma'lumotlarni yo'qotishingiz mumkin.
So'rovning umumiy ko'rinishi:
UPDATE jadval SET
kolonka1 = ifoda1,
kolonka2 = ifoda2,
kolonka3 = ifoda3
WHERE shart;
Keling, barcha xodimlarning maoshini 100 ga oshiradigan so‘rovni yozamiz. Bizning so'rovimiz quyidagicha ko'rinadi:
UPDATE employee SET
salary = salary+100;
Endi esa maoshi 50K dan kam bo'lganlarning barchasiga uni 20% ga oshiramiz. So‘rov namuna:
UPDATE employee SET
salary = salary*1.2
WHERE salary<50000;
Direktorning maoshini 2 barobar oshirishni ham unutmaymiz:
UPDATE employee SET
salary = salary*2
WHERE id=4;
4.2 Ma'lumotlarni o'zgartirishning murakkab ssenariylari
Agar bir nechta jadvallardagi ma'lumotlarni bir vaqtning o'zida o'zgartirishga qaror qilsangiz, yoki bitta jadvaldagi ma'lumotlarni o'zgartirishda boshqa bir jadvaldan ma'lumotlar bilan to'ldirish kerak bo'lsa yoki birinchi jadvalni o'zgartirish jarayonida boshqa bir jadvaldan ma'lumotlarni qandaydir tarzda ishlatishingiz kerak bo'lsa, unda bizni kutilmagan narsalar kutmoqda.
Keling, employee jadvalida mavjud bo'lgan user jadvalidagi barcha foydalanuvchilarning darajasini o'zgartiramiz. Foydalanuvchilarni bir-biriga moslashtirish uchun ism bilan tekshiramiz.
Bu so'rovni qanday yozmoqchi edik:
UPDATE user SET
level = 80,
WHERE user.name IN (employee jadvalidan ismlar ro'yxati);
employee jadvalidan ismlar ro'yxatini bu so'rovga qo'shamiz:
UPDATE user SET
level = 80,
WHERE user.name IN (select name from employee);
Qiziq! Ismlarni olish uchun SQL so'rovi, hatto vazifaning ta'rifidan ham qisqaroq bo'ldi. SQL yaratganlar bekoriga mehnat qilishmagan.
Seni xafa qilishim kerak – bunday yondashuv ishlamaydi. Avval bu jadvallarni qo'shish kerak, bu taxminan quyidagicha ko'rinadi:
UPDATE jadval1, jadval2 SET
kolonka1 = ifoda1,
kolonka2 = ifoda2,
kolonka3 = ifoda3
WHERE jadval1.id = jadval2.ref_id;
Vazifani biroz murakkablashtiramiz. Faqat yaxshi xodimlar uchun, ularning maoshi 50k dan ko'p bo'lganlarda, darajani 80 ga o'rnatish kerak. To'liq yechim quyidagicha bo'ladi:
UPDATE user, yaxshi_xodimlar SET
user.level = 80
WHERE user.name = yaxshi_xodimlar.name;
Bunday jadval birlashtirish - bu aslida INNER JOIN, shuning uchun oxirida faqat ikkinchi jadvaldagi ismlarga mos kelgan foydalanuvchilar qoladi.
Lekin yaxshi xodimlarni tanlashimiz kerak bo'lgani uchun, bu yerda yana biroz kod yozamiz:
SELECT * FROM employee WHERE salary >= 50000
Endi bu jadvalni yakuniy so'rovimizga qo'yamiz:
UPDATE user,
(SELECT * FROM employee WHERE salary >= 50000) good_emps
SET
user.level = 80
WHERE user.name = good_emps.name;
Endi buni qabul qil.
GO TO FULL VERSION