استعلام DELETE
يُستخدم استعلام 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 |
---|---|---|---|---|
نعم | نعم | نعم | نعم | نعم |