دستور SELECT DISTINCT در SQL چیست و چه کاربردی دارد؟
💡آشنایی با حذف تکرارها
در پایگاه داده، ممکن است یک ستون در چندین رکورد مقدار یکسانی داشته باشد. برای نمونه، چند مشتری میتوانند در یک شهر یا استان زندگی کنند. اگر با دستور معمولی
دستور Select فقط نام آن ستون را بخوانید، مقدارهای تکراری نیز در نتیجه دیده میشوند.
دستور SELECT DISTINCT در SQL این تکرارها را از خروجی حذف میکند و فهرستی از مقدارهای یکتا به شما میدهد.
✅ساختار پایه
عبارت
DISTINCT بلافاصله پس از واژه SELECT قرار میگیرد. سپس نام یک یا چند ستون و در ادامه نام جدول نوشته میشود. این عبارت روی نتیجه پرس و جو اثر میگذارد، نه روی دادههای ذخیره شده؛ بنابراین رکوردهای تکراری همچنان در جدول باقی میمانند و فقط در خروجی همان پرس و جو نمایش داده نمیشوند.
SELECT DISTINCT column_name
FROM table_name;
نحوه عملکرد DISTINCT با یک مثال ساده
📊جدول مشتریان
تصور کنید جدول Customer دارای هزار رکورد است و بیشتر مشتریان در ایالت کالیفرنیا زندگی میکنند. اگر ستون State را بدون DISTINCT انتخاب کنید، مقدار CA برای هر رکورد مربوط به آن ایالت تکرار میشود. چنین خروجیای برای کسی که فقط فهرست ایالتهای موجود را میخواهد، طولانی و کم کاربرد است.
SELECT State
FROM Customer;
✨نمایش هر مقدار فقط یک بار
با قرار دادن DISTINCT پس از SELECT، پایگاه داده مقدارهای تکراری State را در نتیجه یکی میکند. در خروجی، هر کد ایالت فقط یک بار دیده میشود؛ بنابراین میتوانید متوجه شوید چه ایالتهایی در جدول مشتریان وجود دارند، بدون آنکه یک مقدار بارها تکرار شود.
SELECT DISTINCT State
FROM Customer;
| روش پرس و جو |
محتوای خروجی |
کاربرد معمول |
| SELECT State |
تمام مقدارهای ستون، از جمله تکراریها |
بررسی رکوردهای ثبت شده |
| SELECT DISTINCT State |
هر مقدار State فقط یک بار |
تهیه فهرست ایالتهای موجود |
استفاده از DISTINCT برای چند ستون
🔎ترکیب ستونها در تشخیص یکتایی
DISTINCT فقط به یک ستون محدود نیست. میتوانید چند ستون را در فهرست SELECT قرار دهید تا ترکیب مقدارهای آن ستونها یکتا شود. در این حالت، هر ستون به تنهایی بررسی نمیشود؛ کل ترکیب یک ردیف با ترکیب ردیفهای دیگر مقایسه میشود. اگر دست کم یکی از مقدارهای ترکیب متفاوت باشد، ردیف جداگانه در نتیجه باقی میماند.
SELECT DISTINCT State, City
FROM Customer;
⚠️نکته درباره چند ستون
فرض کنید دو مشتری در یک ایالت اما در دو شهر متفاوت باشند. پرس و جوی بالا هر دو ترکیب را نگه میدارد، چون مقدار City در آنها برابر نیست. در مقابل، اگر State و City هر دو در دو ردیف یکسان باشند، تنها یک بار در نتیجه دیده میشوند. این تفاوت هنگام تحلیل دادههای مکانی یا دسته بندی اطلاعات اهمیت دارد.
تفاوت DISTINCT و ALL در SQL
ℹ️رفتار پیش فرض SELECT
همتای DISTINCT در این کاربرد، ALL است. ALL به موتور پایگاه داده میگوید همه ردیفهای منطبق را برگرداند، حتی اگر مقدارهای آنها تکراری باشند. این رفتار به طور معمول حالت پیش فرض دستور SELECT است؛ به همین دلیل در بیشتر پرس و جوها لازم نیست ALL را صریحا بنویسید.
SELECT ALL State
FROM Customer;
-- این پرس و جو از نظر نتیجه مانند SELECT State عمل میکند
🧭کدام گزینه را انتخاب کنیم؟
اگر برای گزارش یا فهرست، هر مقدار را فقط یک بار نیاز دارید، DISTINCT گزینه مناسب است. اگر هدف شما مشاهده همه ردیفها یا شمارش تعداد تکرارها باشد، از رفتار عادی SELECT استفاده کنید. انتخاب درست به این بستگی دارد که پرس و جو باید مقدارهای یکتا را نشان دهد یا همه رکوردهای واقعی جدول را بازگرداند.
نکات مهم و روش استفاده بهینه از SELECT DISTINCT
۱. DISTINCT دادههای جدول را حذف نمیکند
1
این عبارت فقط نتیجه پرس و جو را یکتا میکند و تغییری در جدول اصلی نمیدهد. اگر بعدا پرس و جویی بدون DISTINCT اجرا کنید، ردیفهای تکراری دوباره نمایش داده خواهند شد. بنابراین برای پاک سازی دائمی دادهها باید از روشهای بررسی و اصلاح داده استفاده کنید، نه از DISTINCT.
۲. DISTINCT را با شرط WHERE ترکیب کنید
2
میتوانید ابتدا با WHERE ردیفهای مورد نظر را محدود کنید و سپس مقدارهای یکتای باقی مانده را بگیرید. برای نمونه، اگر فقط مشتریان فعال مد نظر باشند، شرط وضعیت را در پرس و جو قرار دهید. به این ترتیب نتیجه هم مرتبطتر میشود و هم از پردازش دادههایی که نیاز ندارید جلوگیری میشود.
SELECT DISTINCT State
FROM Customer
WHERE Status = 'Active';
۳. برای شمارش مقدارهای یکتا از COUNT استفاده کنید
3
گاهی به جای دیدن فهرست، تعداد مقدارهای متفاوت لازم است. در بسیاری از سامانههای SQL میتوانید DISTINCT را داخل تابع COUNT قرار دهید تا تعداد مقدارهای یکتای یک ستون محاسبه شود. رفتار مقدارهای NULL و برخی جزئیات تابع ممکن است با نوع پایگاه داده تفاوت داشته باشد؛ بنابراین مستندات سامانه مورد استفاده را هم بررسی کنید.
SELECT COUNT(DISTINCT State) AS UniqueStateCount
FROM Customer;
۴. ترتیب نمایش را جداگانه مشخص کنید
4
DISTINCT به تنهایی ترتیب مشخصی برای نمایش نتیجه تضمین نمیکند. اگر خروجی باید بر اساس نام یا مقدار مرتب باشد، از ORDER BY استفاده کنید. مرتب سازی، یکتا سازی و فیلتر کردن هر کدام نقش جداگانهای دارند و ترکیب درست آنها خوانایی گزارش را بهتر میکند.
SELECT DISTINCT State
FROM Customer
ORDER BY State;
۵. از استفاده بی دلیل روی دادههای بزرگ پرهیز کنید
5
برای تشخیص ردیفهای تکراری، پایگاه داده باید مقدارهای نتیجه را مقایسه کند. در جدولهای بزرگ یا زمانی که ستونهای زیادی انتخاب شدهاند، این کار ممکن است منابع بیشتری مصرف کند. فقط ستونهایی را انتخاب کنید که واقعا به آنها نیاز دارید و در صورت کندی، اجرای پرس و جو و طرح اجرای آن را بررسی کنید.
مزایا و محدودیتهای دستور DISTINCT
| جنبه |
مزیت یا محدودیت |
توصیه |
| خوانایی خروجی |
مقدارهای تکراری را از فهرست حذف میکند. |
برای گزارش فهرست مقادیر موجود استفاده کنید. |
| داده اصلی |
رکورد تکراری را از جدول پاک نمیکند. |
برای اصلاح دائمی دادهها، راهکار جداگانه به کار ببرید. |
| کارایی |
مقایسه مقدارها میتواند هزینه پردازشی داشته باشد. |
ستونهای غیرضروری را از SELECT حذف کنید. |
| چند ستون |
یکتایی بر اساس ترکیب همه ستونهای انتخاب شده است. |
ترکیب ستونها را پیش از اجرا بررسی کنید. |
خطاهای رایج هنگام استفاده از DISTINCT
⚠️برداشت اشتباه از یکتایی
یکی از اشتباههای متداول این است که تصور شود DISTINCT فقط ستون اول را بررسی میکند. در واقع، هنگام انتخاب چند ستون، کل ترکیب مقدارهای همان ستونها مبنای مقایسه قرار میگیرد. همچنین ممکن است کاربر انتظار داشته باشد این عبارت رکوردهای تکراری جدول را حذف کند؛ در حالی که تغییر فقط در مجموعه نتیجه رخ میدهد.
🛠️بررسی نتیجه پیش از استفاده
اگر نتیجه غیرمنتظره است، ابتدا ستونهای SELECT را بررسی کنید. ممکن است ستونی مانند شناسه مشتری باعث شود هر ردیف همچنان ترکیب متفاوتی داشته باشد و در نتیجه هیچ ردیفی حذف نشود. سپس شرطهای WHERE و معنای مورد انتظار از «مقدار یکتا» را مرور کنید. این بررسی ساده اغلب علت خروجی نادرست را مشخص میکند.
جمع بندی
📌انتخاب درست برای نتیجههای خوانا
در نهایت،
دستور SELECT DISTINCT در SQL راهی ساده برای نمایش مقدارهای یکتا در خروجی یک پرس و جو است. این دستور برای تهیه فهرست دستهها، شهرها یا وضعیتهای ثبت شده کاربرد دارد و با چند ستون نیز کار میکند؛ اما دادههای جدول را تغییر نمیدهد. با انتخاب ستونهای لازم، استفاده سنجیده از شرطها و مرتب سازی خروجی، میتوانید نتیجهای خوانا و کاربردی بسازید. این دقت در کارهای فنی و پروژههای
طراحی سایت نیز به مدیریت بهتر دادهها کمک میکند.
سوالات متداول دستور SELECT DISTINCT در SQL
دستور DISTINCT در SQL چه کاری انجام میدهد؟
این دستور مقدارهای تکراری را از نتیجه یک پرس و جو حذف میکند و هر مقدار یا ترکیب یکتا را فقط یک بار نشان میدهد. دادههای اصلی جدول تغییر نمیکنند.
DISTINCT را کجا باید در دستور SELECT بنویسیم؟
واژه DISTINCT بلافاصله پس از SELECT و پیش از نام ستونها قرار میگیرد؛ برای نمونه: SELECT DISTINCT State FROM Customer.
آیا DISTINCT با چند ستون هم کار میکند؟
بله. در این حالت پایگاه داده ترکیب مقدارهای همه ستونهای انتخاب شده را مقایسه میکند. ردیفهایی که ترکیب یکسان دارند یک بار در خروجی میآیند.
تفاوت DISTINCT و ALL چیست؟
DISTINCT مقدارهای تکراری را از نتیجه کنار میگذارد، اما ALL همه ردیفهای منطبق را نگه میدارد. ALL رفتار پیش فرض SELECT است و معمولا نیازی به نوشتن آن نیست.
آیا DISTINCT رکوردهای تکراری را از جدول پاک میکند؟
خیر. DISTINCT فقط نتیجه پرس و جو را یکتا میکند و هیچ رکوردی را از جدول حذف یا ویرایش نمیکند. برای پاک سازی دائمی دادهها باید از روشهای مناسب مدیریت داده استفاده شود.