استعلام DELETE

من موسوعة حسوب
< SQL
مراجعة 11:15، 13 يناير 2018 بواسطة Nourtam (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

يُستخدم استعلام DELETE لحذف سجل أو أكثر، وله البنية العامة:

DELETE FROM table_name
WHERE condition;

إذ يُحدد الشرط الذي ستُحذف السجلات وفقًا له في عبارة WHERE. أما تنفيذ الاستعلامَيْن الآتيين:

DELETE * FROM table_name;
DELETE FROM table_name;

فيؤدي لحذف كافة السجلات الموجودة في الجدول.

مثال

إن كان جدول الزبائن customers موجودًا في قاعدة البيانات على النحو الآتي:

Bill OrderID FullName CustomerID
160 0291 Abd al-Salam Hadi 1156
170 0302 Ahmad Mostafa 1157
210 0203 Reem Hammad 1158
350 0294 Abd Allah Sadiq 1159
185 0255 Raghad al-Hamdan 1160
165 0276 Abd al-Razzaq Salloum 1161
175 0247 Hussam Siraj 1162
180 0208 Hiba Maktabi 1163
170 0219 Abd al-Rahman Rida 1164
220 0210 Abd al-Qader Khalil 1165
350 0211 Fateh Hammad 1166
185 0202 Abd al-Azziz Othman 1167
400 0213 Zahraa Qasem 1168
350 0314 Abd al-Wahhab Masri 1169
185 0215 Mona Saber 1170

لحذف السجلات التي يبدأ فيها اسم الزبون بكلمة Abd أو تتراوح فاتورته ما بين 150 - 200 $ يصبح الاستعلام بالشكل الآتي:

DELETE FROM customers
WHERE FullName LIKE Abd% OR Bill BETWEEN 150 AND 200;

إذ إنَّ المعامل LIKE يحدد نمطًا للسلسلة النصية الموجودة في حقل FullName وهو تتابع أي تسلسل للمحارف من بعد البدء بكلمة Abd، والمعامل BETWEEN يحدد المجال الواقع بين القيمتَيْن المحدّدتين.

بعد تنفيذ الاستعلام سيصبح الجدول بالشكل:

Bill OrderID FullName CustomerID
210 0203 Reem Hammad 1158
350 0211 Fateh Hammad 1166
400 0213 Zahraa Qasem 1168

حذف عدد محدد من السجلات

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

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

DELETE TOP (5) FROM customers
WHERE FullName LIKE Abd% OR Bill BETWEEN 150 AND 200;

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

DELETE FROM customers
WHERE FullName LIKE Abd% OR Bill BETWEEN 150 AND 200;
LIMIT 5;

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

Bill OrderID FullName CustomerID
210 0203 Reem Hammad 1158
175 0247 Hussam Siraj 1162
180 0208 Hiba Maktabi 1163
170 0219 Abd al-Rahman Rida 1164
220 0210 Abd al-Qader Khalil 1165
350 0211 Fateh Hammad 1166
185 0202 Abd al-Azziz Othman 1167
400 0213 Zahraa Qasem 1168
350 0314 Abd al-Wahhab Masri 1169
185 0215 Mona Saber 1170

وفي حال استخدام عبارة الترتيب ORDER BY في الاستعلام فسيُحذَف العدد المطلوب من السجلات بعد ترتيبها بحسب العمود المُحدَّد، إن تنفيذ الاستعلام الآتي في محرك SQL Server بالشكل:

DELETE TOP (5) FROM customers
ORDER BY Bill;

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

DELETE FROM customers
ORDER BY Bill
LIMIT 5;

سيؤدي إلى حذف السجلات الخمس الأولى من بعد ترتيبها بحسب عمود Bill ترتيبًا تصاعديًا، وسيصبح الجدول:

Bill OrderID FullName CustomerID
160 0291 Abd al-Salam Hadi 1156
170 0302 Ahmad Mostafa 1157
210 0203 Reem Hammad 1158
185 0255 Raghad al-Hamdan 1160
165 0276 Abd al-Razzaq Salloum 1161
175 0247 Hussam Siraj 1162
180 0208 Hiba Maktabi 1163
170 0219 Abd al-Rahman Rida 1164
185 0202 Abd al-Azziz Othman 1167
185 0215 Mona Saber 1170

يًلاحظ هنا أن الترتيب مستخدَم مع استعلام DELETE ولذلك فإن سجلات الجدول السابق غير مرتبة لأنها ليست ناتجة عن استعلام الحصول على السجلات SELECT وبقيت بترتيبها الأصلي في الجدول.

حذف البيانات من الجدول اعتمادًا على قيم البيانات في جدول آخر

إن كان الجدول الآتي orders موجودًا في قاعدة البيانات السابقة التي تحوي جدول الزبائن customers السابق:

Item EmployeeID OrderID
ZenFone 4 Max 096 0302
ZenFone 3 Max 054 0291
ZenFone 4 4G LTE 096 0213
VivoBook Max 054 0210
ZenFone 3 Deluxe 5.7”‎ 054 0314
ZenFone 3 Laser (ZC551KL)‎ 054 0276

ولحذف السجلات من جدول customers التي طلبها موظف محدد في الجدول orders، سيصبح الاستعلام بالشكل الآتي:

DELETE FROM customers 
WHERE OrderID IN 
  (SELECT OrderID 
  FROM orders 
  WHERE EmployeeID = 054);

وهذا بالاعتماد على مفهوم الاستعلام الفرعي Subquery الموجود في قائمة المعامل IN الذي يحدد عددًا من القيم المحتملة لقيمة الحقل OrderID، وبعد تنفيذ الاستعلام السابق سيصبح جدول الزبائن customers على النحو الآتي:

Bill OrderID FullName CustomerID
170 0302 Ahmad Mostafa 1157
210 0203 Reem Hammad 1158
350 0294 Abd Allah Sadiq 1159
185 0255 Raghad al-Hamdan 1160
175 0247 Hussam Siraj 1162
180 0208 Hiba Maktabi 1163
170 0219 Abd al-Rahman Rida 1164
350 0211 Fateh Hammad 1166
185 0202 Abd al-Azziz Othman 1167
400 0213 Zahraa Qasem 1168
185 0215 Mona Saber 1170

التوافقية

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

مصادر