4.1 ปรับปรุงคำสั่ง SET

หากคุณต้องการเปลี่ยนบันทึกที่มีอยู่ในตารางสำหรับสิ่งนี้เราจะใช้ตัวดำเนินUPDATEการ

ในอีกด้านหนึ่ง ตัวดำเนินการUPDATEคล้ายกับตัวดำเนินการINSERTเนื่องจากเราจำเป็นต้องระบุค่าใหม่สำหรับคอลัมน์ และในทางกลับกัน บนตัวดำเนินการSELECTเพราะมันช่วยให้คุณทำงานกับกลุ่มข้อมูลได้ทันที

สำคัญ! จุดประสงค์ของตัวดำเนินการUPDATEคือเพื่อเปลี่ยนข้อมูลที่ไม่ได้อยู่ในแถวเดียวของตาราง แต่ในทุกแถวที่ตรงตามเงื่อนไขที่กำหนด และหากคุณทำผิดพลาดเพียงเล็กน้อย ข้อมูลทั้งหมดในตารางก็จะสูญหายไปได้อย่างง่ายดาย

มุมมองทั่วไปของคำขอ:

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

ลองเขียนแบบสอบถามที่จะเพิ่มเงินเดือนของพนักงานทั้งหมด 100 คน แบบสอบถามของเราจะมีลักษณะดังนี้:

UPDATE employee SET
  	salary = salary+100;

และตอนนี้สำหรับทุกคนที่มีเงินเดือนน้อยกว่า 50K เราจะเพิ่มให้อีก 20% ตัวอย่างคำขอ:

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

และแน่นอนว่าเราจะเพิ่มเงินเดือนของผู้อำนวยการเป็น 2 เท่า ถ้าไม่มีเขาจะเป็นอย่างไร:

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

4.2 สถานการณ์แก้ไขข้อมูลที่ซับซ้อน

หากคุณตัดสินใจที่จะเปลี่ยนแปลงข้อมูลในหลายตารางพร้อมกัน หรือเมื่อคุณเปลี่ยนแปลงข้อมูลในตารางหนึ่ง คุณต้องเติมข้อมูลจากอีกตารางหนึ่ง หรือเพียงแค่ใช้ข้อมูลจากอีกตารางหนึ่งในกระบวนการเปลี่ยนแปลงตารางแรก แล้วเซอร์ไพรส์รอเราอยู่

ลองเปลี่ยนระดับของผู้ใช้ทั้งหมดในตารางผู้ใช้ที่มีอยู่ในตารางพนักงาน เพื่อความง่าย เราจะตรวจสอบความบังเอิญของผู้ใช้ตามชื่อ

เราต้องการเขียนแบบสอบถามนี้อย่างไร:

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

มาเพิ่มรายชื่อจากตารางพนักงานในแบบสอบถามนี้กันเถอะ:

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

น่าสนใจ! แบบสอบถาม SQL เองเพื่อรับชื่อนั้นสั้นกว่าคำอธิบายของงานด้วยซ้ำ ผู้สร้าง SQL ไม่ได้กินขนมปังโดยเปล่าประโยชน์

บังคับให้คุณอารมณ์เสีย -วิธีการนี้จะไม่ทำงาน. ก่อนอื่นคุณต้องเข้าร่วมตารางเหล่านี้ ซึ่งจะมีลักษณะดังนี้:

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;

มาทำให้มันยากขึ้นอีกหน่อย ต้องตั้งเลเวลเป็น 80 เฉพาะพนักงานดีๆที่เงินเดือนเกิน 50k โซลูชันที่สมบูรณ์จะมีลักษณะดังนี้:

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

การรวมตารางดังกล่าวเป็นจริงINNER JOINดังนั้นในที่สุดผู้ใช้ที่มีชื่อตรงกันในตารางที่สองจะยังคงอยู่

แต่ยังไงก็ต้องเลือกพนักงานดีๆ อยู่ดี ดังนั้นเรามาเพิ่มโค้ดกัน:

SELECT * FROM employee WHERE salary >= 50000

และตอนนี้เราแทนที่ตารางนี้ในแบบสอบถามสุดท้ายของเรา:

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

อยู่กับมันตอนนี้