الاستعلام UPDATE

من موسوعة حسوب
< SQL

يُستخدم هذا الاستعلام من أجل تحديث قيم البيانات المخزنة في سجلات الجداول.

البنية العامة للاستعلام:

UPDATE tbl_name 
SET col_name = [|DEFAULT], col_name = value [|DEFAULT], 
WHERE condition

إذ من الممكن تحديث عدة قيم في عدة سجلات ضمن نفس الاستعلام، وعند استخدام الكلمة المفتاحية DEFAULT ستصبح القيمة في الحقل هي القيمة الافتراضية لنوع البيانات فيه، أما إن كان الاستعلام بالشكل:

UPDATE tbl_name 
SET col_name = value [|DEFAULT], col_name = value [|DEFAULT], 

فتنفيذه يؤدي لتعديل قيمة الحقل المحدد بكافة السجلات الموجودة في الجدول بسبب عدم وجود الشرط الذي يحدد السجلات التي ستُعدل.

مثال

إن كان الجدول التالي (employees) موجودًا في قاعدة البيانات:

WeeklyHours Work City Salary Name EmployeeID
25 In centre Beruit 200 Natalie Sinno 0156
30 In centre Alexandria 275 Ahmad Rida 0157
25 In centre Aleppo 210 Kareem al-Hamdan 0158
28 In centre Rabat 190 Mahdi Thabit 0159
36 In centre Jedda 300 Rabie al-Sadi 0160
36 In centre Amman 290 Jaber Hammad 0161
30 In centre Cairo 210 Rawda Hussien 0162

ويُراد زيادة 10% لقيمة الراتب وتعديل طبيعة العمل لتصبح عبر شبكة الإنترنت بدلًا من المركز، وذلك لكل موظف يسكن في أيّ من المدن (Aleppo, Cairo, Rabat) بالاستفادة من المعامل IN، فسيكون الاستعلام المطلوب:

UPDATE employees 
SET Salary = Salary * 1.1 , Work =online
WHERE City IN (Aleppo, Cairo, Rabat);

وسيصبح الجدول بالقيم الجديدة كالآتي:

WeeklyHours Work City Salary Name EmployeeID
25 In centre Beruit 200 Natalie Sinno 0156
30 In centre Alexandria 275 Ahmad Rida 0157
25 online Aleppo 231 Kareem al-Hamdan 0158
28 online Rabat 209 Mahdi Thabit 0159
36 In centre Jedda 300 Rabie al-Sadi 0160
36 In centre Amman 290 Jaber Hammad 0161
30 online Cairo 231 Rawda Hussien 0162

تحديث قيمة عدد محدد من السجلات

يمكن تعيين عدد محدد من السجلات التي ستُحدّث قيمتها وذلك بالاعتماد على الكلمة المفتاحية TOP في محرك SQL Server والكلمة المفتاحية LIMIT في محركات PostgreSQL و SQLite و MySQL والكلمة المفتاحية ROWNUM في محرك Oracle وذلك بنفس الطريقة المستخدمة لتحديد عدد السجلات في استعلام SELECT، واستعلام DELETE.

لدى تنفيذ نفس الاستعلام السابق بإضافة TOP بمحرك SQL Server يصبح بالشكل الآتي:

UPDATE TOP (2) employees 
SET Salary = Salary * 1.1, Work =online
WHERE City IN (Aleppo, Cairo, Rabat);

وفي محركات PostgreSQL و SQLite و MySQL بالشكل:

UPDATE employees 
SET Salary = Salary * 1.1, Work =online
WHERE City IN (Aleppo, Cairo, Rabat)
LIMIT 2;

وفي محرك Oracle بالشكل:

UPDATE employees 
SET Salary = Salary * 1.1, Work =online
WHERE City IN (Aleppo, Cairo, Rabat) AND ROWNUM <= 2;

وعند تنفيذ الاستعلامات الثلاثة السابقة ستُحدَّث قيمة الراتب ومكان العمل في سجلين فقط دون تعديل الثالث، أي تصبح القيم بالجدول على النحو الآتي:

WeeklyHours Work City Salary Name EmployeeID
25 In centre Beruit 200 Natalie Sinno 0156
30 In centre Alexandria 275 Ahmad Rida 0157
25 online Aleppo 231 Kareem al-Hamdan 0158
28 online Rabat 209 Mahdi Thabit 0159
36 In centre Jedda 300 Rabie al-Sadi 0160
36 In centre Amman 290 Jaber Hammad 0161
30 In centre Cairo 210 Rawda Hussien 0162

تحديث القيم في السجلات اعتمادًا على قيم مخزنة في جدول آخر

ليكن الجدول الآتي باسم leaves موجودًا في قاعدة البيانات السابقة التي تحوي جدول الموظفين (employees):

AnnualLeave EmployeeID
10 0156
12 0157
10 0158
11 0159
15 0160
15 0161
12 0162

لإضافة يوميّ إجازة إضافيَّين للجدول leaves اعتمادًا على عدد ساعات العمل المحددة في جدول employees بحيث تكون ساعات عمل الموظف أكثر من 25 ساعة، سيُستخدم الاستعلام الآتي:

UPDATE leaves  
SET AnnualLeave = AnnualLeave + 2  
FROM (SELECT EmployeeID FROM employees  WHERE WeeklyHours > 25 ) AS tempTable 
WHERE leaves.EmployeeID = tempTable.EmployeeID;

إذ إنَّ هذا الاستعلام يعتمد على مفهوم الاستعلام الفرعي في عبارة FROM والذي حَدَّد السجلات من الجدول employees التي ساعات العمل فيها أكثر من 25، وسُمّي الجدول الناتج باسم tempTable بالاستفادة من المعامل AS، وتحقق التقابل ما بين الجدولين ضمن عبارة WHERE.

التوافقية

SQLServer SQLite Oracle PostgreSQL MySQL
نعم نعم نعم نعم نعم

مصادر