دستور Delete در SQL – از کاربرد تا نحوه استفاده به زبان ساده


این مطلب از مجله فرادرس را به بررسی دستور Delete در SQL اختصاص خواهیم داد. در این مطلب اطلاعات نسبتا کاملی درباره این دستور و نحوه کوئری نویسی برای حذف یک یا چندین ردیف از یک یا چندین جدول را خواهیم آموخت. همچنین عبارتهایDELETE وTRUNCATE را مقایسه خواهیم کرد زیرا در نگاه اول، این عبارتها احتمالا طوری به نظر میرسند که هر دو وظیفه یکسانی را انجام میدهند، اما تفاوتهای حساس و پنهانی با یکدیگر دارند.
برای اینکه بتوانیم در این مطلب از مجله فرادرس تا اندازه کاملی همه زوایای دستور DELETE را بررسی کنیم، باید در ابتدا شناختی درباره دستور Delete در SQL پیدا کنیم. سپس با سینتکس پایه و کلمات کلیدی این دستور آشنا میشویم تا بتوانیم با توجه به انواع سناریوهایی که با آنها روبهرو خواهیم شد کوئری دستور را گسترش دهیم. بعد مثالهایی از پیادهسازی کوئری این دستور را بررسی خواهیم کرد. به تفاوت کوچک ولی مهم بین بین دستورات TRUNCATE و DELETE در SQL خواهیم پرداخت و در آخر شیوه استفاده از دستور Delete را در محیط گرافیکی نشان میدهیم.
دستور DELETE در SQL چیست؟
در ابتدا باید تعریفی از دستور Delete در SQL ارائه دهیم و هدفی که از اجرای این دستور دنبال میشود را مشخص کنیم. DELETE کوئری است که یک یا چندین رکورد را از جدول در SQL Server حذف میکند. حتی میتوان همه دادهها یا دادههای مشخص شده برحسب شرطی که توسط عبارت WHERE در SQL تعیین شده است، به وسیله این عبارت حذف کرد. توصیه شده است که وقتی از دستورDELETE استفاده میکنید، حتما به صورت دقیق به کوئری که نوشتهاید توجه کنید و هشیارانه این دستور را اجرا کنید، زیرا این دستور دادهها را به صورت دائمی حذف میکند.
سینتکس پایه کوئری DELETE
شکل پایهای دستور Delete در SQL Server را به سادهترین صورت در کد زیر نمایش دادهایم.
1DELETE FROM <table_name>
2WHERE <condition>;
به توضیح پارامترهایی که در کد بالا استفاده شدهاند در ادامه توجه کنید.
- table_name نام جدولی که میخواهید سطرهای آن را حذف کنید. توجه کنید که، هر سطر یا ردیف معادل یک رکورد اطلاعات در پایگاه داده ما هستند.
- condition شرطی برای اینکه فقط دادههای لازم به حذف شدن را واکشی کنیم و باقی دادهها فیلتر شوند.

استفاده از داده ها همزمان با حذف
اگر کوئری میخواهید که رکوردهایی که قرار است حذف شوند را برای آخرین نمایش یا استفاده به کاربر برگرداند، میتوانید بهصورت زیر از دستور Delete در SQL استفاده کنید.
1DELETE FROM <table_name>
2WHERE <condition>
3RETURNING *;
مثال هایی از عبارت SQL DELETE
در ادامه مثالی آوردهایم تا نحوه استفاده از دستور Delete در SQL را برای حذف ردیفی از جدول تمرین کنیم. تصور کنید که جدولی درباره تاریخ تولد افراد تشکیل دادهاید. تقریبا در بقیه بخشهای این مطلب از جدولی که در پایین میبینید، برای اجرای نمونهکوئریها استفاده خواهیم کرد.
date | first_name | last_name | id |
1976-09-28 | Tom | Crawford | 1 |
1990-10-05 | Mia | Chesterfield | 2 |
1987-10-10 | Sally | Colland | 3 |
1995-03-07 | Peter | Cromwell | 4 |
1986-04-23 | Olivia | Nutter | 5 |
برای اینکه از این جدول رکوردی حذف کنید، باید کوئری که در ادامه آوردهایم را اجرا کنید.
1DELETE FROM birthdays
2WHERE id=1;
بعد از اینکه کوئری بالا را اجرا کردید ردیفی که شماره id در آن برابر یک است از جدول حذف خواهد شد و در ادامه جدول به شکل زیر خواهد شد.
date | first_name | last_name | id |
1990-10-05 | Mia | Chesterfield | 2 |
1987-10-10 | Sally | Colland | 3 |
1995-03-07 | Peter | Cromwell | 4 |
1986-04-23 | Olivia | Nutter | 5 |
حذف فقط یک رکورد
میتوانید فقط یک رکورد را با استفاده از دستور Delete در SQL با توجه به شرایط مشخص شده در عبارتWHERE حذف کنید. بنابراین کوئری به شکل نوشته شده در پایین، خواهد بود.
1DELETE FROM birthdays
2WHERE id=4;
با اجرای این کوئری همانند اتفاقی که در بالا افتاد، رکوردی که id برابر با 4 داشته باشد از جدول Birthdays حذف خواهد شد.
حذف چندین رکورد
برای اینکه چندین سطر را از جدولی حذف کنید، میتوانید از عملگر IN استفاده کنید. برای نمونه به کد زیر دقت کنید.
1DELETE FROM birthdays
2WHERE id IN (1, 3, 5);
این کوئری همه سطرهایی را که id آنها برابر با 1، 3 و 5 باشد را از جدول Birthdays حذف میکند. لطفا به سینتکسی که برای دستور Delete در SQL آمده در کد بالا توجه کنید، بعد از اینکه در خط اول مشخص کردیم در کدام جدول قصد اجرای عملیات حذف را داریم، در خط دوم، اول از همه عبارتWHERE و بعد از آن نام ستون میآیدid سپس عملگرIN و در آخر شماره یا مقدار سطرها در ستون id داخل پرانتز میآیند، در حالی که با کاما از هم جدا شدهاند.

عملگرهای BETWEEN و AND
همچنین میتوانید تعدادی از سطرها را به وسیله تعریف محدوده آنها پاک کنید. این کار به کمک عملگرهای BETWEEN و AND انجام میشود. به عنوان مثال، درصورتی که بخواهید سطرهایی را حذف کنید که شماره id آنها از 2 تا 5 باشد به صورت زیر اسکریپت خود را خواهید نوشت.
1DELETE FROM birthdays
2WHERE id BETWEEN 2 AND 5
عملگر BETWEENدر بعضی از پایگاههای داده اعداد ابتدا و انتهای بازه را مشمول عملیات قبل از عملگر نمیکند، حتی در یک پایگاه داده بین نوع دادههای مختلف میتواند رفتار متفاوتی داشته باشد. حتما قبل از نهایی کردن کوئری خود این موارد را بررسی کنید. از عملگر BETWEENبرای تعیین محدوده بین حروف الفبا و تاریخ و نوع دادههای دیگری نیز میتوانید استفاده کنید.
عملگرهای شرطی بزرگتر و کوچکتر
بجز عملگرBETWEENگزینههای دیگری نیز هستند که میتوان از آنها برای حذف چندین رکورد استفاده کرد. از این عملگرها زمانی استفاده میشود که ابتدای محدوده مورد نظر برای حذف یا نگهداری دادهها مشخص است اما انتهای خاصی ندارند.برای مثال فرض کنید جدول تولد، دارای ستونی برای سن اشخاص هم باشد و میخواهیم افراد بالای ۲۵ سال یا به عبارتی رکوردهایی که مقدار ستون AGE آنها بیشتر از 25 است را حذف کنیم. به عبارت زیر توجه کنید.
1DELETE FROM birthdays
2WHERE AGE > 25;
میبینیم که با کمک عملگر شرطی > توانستیم چندین رکورد را به شرط وجود داشتن حذف کنیم. استفاده از عملگرهای شرطی هم جزو روشهای حذف چندین رکورد است.
حذف همه رکوردها از جدول
بهمنظور اینکه همه دادههای جدولی را با کمک دستور Delete در SQL پاک کنیم، فقط نیاز دارید که بسیار ساده دستورDELETE را اجرا کنید. سینتکس کوئری به این صورت است که دستورDELETEدر ابتدا اسکریپت نوشته میشود سپس از کلمه FROM استفاده میکنیم و در آخر نام جدولی را وارد میکنیم که میخواهیم همه اطلاعات آن را پاک کنیم. در این مورد خاص عبارتWHERE جایگاهی برای استفاده ندارد.
1DELETE FROM birthdays
این کوئری همه رکوردهای جدول Birthdays را حذف میکند.
حذف کردن ردیف های مرتبط باهم از چندین جدول مختلف
ردیفهای مرتبط باهم از جداول مختلف با استفاده از عملگرJOIN حذف میشوند. در این بخش، مثالی برای نمونه از عملیات حذف با کمک عبارت INNER JOIN را بازبینی خواهیم کرد. فرض کنید که قرار است ردیفهای مربوط به هم را در دو جدول مختلف -جدولهای تولدها و مرخصیها- حذف کنید. میتوانید با اجرا کردن کوئریDELETE که در ادامه آمده است، این مسئله را حل کنید.
1DELETE b, v
2 FROM birthdays b
3 INNER JOIN vacations v
4 ON b.id = v.birthdays_id
5 WHERE b.date = 1976-09-28;
عبارت آورده شده در بالا تمام ردیفهایی را که با شرط b.date = 1976-09-28 همخوانی داشته باشند، از جدولهای Vacations و Birthdays حذف میکند.
تفاوت بین دستور TRUNCATE و دستور DELETE در SQL چیست؟
استفاده از دستورDELETE تنها راه حذف کردن دادهها در SQL نیست. عبارت TRUNCATE در SQL نیز برای انجام همچین وظیفهای، البته با کمی تفاوت در عملکرد، وجود دارد. هر دو این دستورها برای عمل حذف کردن داده از جدول استفاده میشوند اما هرکدام ریزهکاریهای مخصوص به خود را دارند.
تلاش کردیم تفاوتهای اساسی بین دو دستورDELETEو TRUNCATEرا در جدول زیر نمایش دهیم تا درک بهتری بر اساس تصویر بهدست آورید.
TRUNCATE | DELETE |
دستور «زبان تعریف دادهها» (DDL | Data Definition Language) است. | دستور «زبان دستکاری دادهها» (DML | Data Manipulation Language) است. |
همه دادهها را از جدول حذف میکند. | تمام دادهها یا با استفاده از عبارت WHERE دادههای خاص را حذف میکند. |
همه دادهها را به صورت همزمان حذف میکند. | رکوردها را به صورت یک به یک در یک زمان حذف میکند. |
در هر جدول به مجوز ALTER نیاز دارد. | در هر جدول به مجوز DELETE نیاز دارد. |
کل جدول را برای عملیات حذف کردن، قفل میکند. | هر سطر را در جدول قفل میکند تا حذف شود. |
کمترین میزان ثبت لاگها را دارد. به همین دلیل از عملیات DELETE بسیار سریعتر اجرا میشود. | برای هر رکوردی که حذف میشود، یک بار عملیات ثبت حذف را در لاگ تراکنش وارد میکند. بنابراین، از عملیات TRUNCATE سرعت کمتری دارد. |
همه سطرهای حذف شده از جدول را برنمیگرداند. | همه سطرهای حذف شده از جدول را برمیگرداند. |
نمیتواند رکوردها را با محدودیت کلید خارجی پایگاه داده حذف کند. | میتواند رکوردها را با محدودیت کلید خارجی حذف کند. |
در پایین سینتکس پایه دستور TRUNCATE در SQL را قرار دادهایم.
1TRUNCATE TABLE <table_name>
تنها پارامتر این سینتکس عبارت از table_name است. این پارامتر محل قرارگیری نام جدولی که قرار است سطرها از آن پاک شوند را نشان میدهد.
استفاده از کوئری DELETE در محیط گرافیکی برای SQL Server
باید روش اجرای دستور Delete در SQL را در محیطهای گرافیکی نیز بررسی کنیم. در واقع، این ابزارها معمولا ۳ روش جایگزین برای استفاده از این عبارت برای حذف دادهها از جدولی در پایگاه داده ارائه میدهند.
- روش اول: استفاده از ویژگی «تکمیل کد» (Code Completion)
- روش دوم: استفاده از قابلیت عملیاتی «قطعه کدها» (Code Snippet)
- روش سوم: استفاده از گزینه «تولید اسکریپت» (Generate Script)
استفاده از ویژگی Code Completion
در روش استفاده از ویژگی تکمیل کد تلاش میکنیم که کدهای مربوط به کوئری را بهصورت از پیش آماده شده استفاده کنیم.
- مرحله اول: در ادیتور SQL شروع به نوشتن کلمه DELETE کنید. منو «کرکرهای» (Drop-Down) ظاهر خواهد شد.
- مرحله دوم: روی گزینه DELETE دابل کلیک کنید.
- مرحله سوم: کوئری را پر کنید و سپس بر روی دکمه Execute در «نوار ابزار استاندارد» (Standard Toolbar)، کلیک کنید.
استفاده از قابلیت عملیاتی Code Snippet
در روش استفاده از قابلیت عملیاتی قطعه کدها، با نوشتن هر کلمه کلیدی در ادیتور امکانات مربوط به آن کلمهکلیدی ظاهر میشود. بهصورت زیر این مرحله را طی میکنیم.
- مرحله اول: در ادیتور SQL شروع به نوشتن کلمه DELETE کنید. منو «کرکرهای» (Drop-Down) ظاهر خواهد شد.
- مرحله دوم: روی گزینه DeleteFrom دابل کلیک کنید.
- مرحله سوم: فقط باید کوئری را برای همساز شدن با نیازمندیهای خود اصلاح کنید و سپس بر روی دکمه Execute در نوار ابزار استاندارد، کلیک کنید.
استفاده از گزینه Generate Script
این روش به آپشنی خاص اشاره دارد. این آپشن برای هر دستوری در SQL از گزینه تولید خودکار اسکریپت استفاده میکند.
- در مرورگر پایگاه داده SQL، روی جدول مورد نظر راست-کلیک کنید و طبق مسیر روبهرو پیش بروید.
Generate Script As > DELETE > To New SQL Window
- در سند SQL که باز شده است، کوئری را تنظیم کنید و سپس بر روی دکمه Execute در نوار ابزار استاندارد، کلیک کنید.
جمع بندی
حذف کردن رکوردها از جدولها و پایگاه دادهها قسمت مهمی از مدیریت پایگاههای داده است. بعضی وقتها دادههای اشتباهی در جداول پایگاه داده وارد میکنیم یا دادههای ما از تاریخ مصرف خود عبور میکنند و نیاز به اصلاح یا تغییردادن پیدا میکنند و شرایط دیگری همانند اینها، همه نیاز به استفاده از دستور Delete در SQL دارند. در این مطلب از مجله فرادرس تلاش کردیم که تا حد ممکن دستور Delete در SQL را تشریح کنیم و انواع موارد استفاده به همراه انواع روشهای استفاده از آن را شرح دهیم.