📚 فصل ۲۱ — محدود کردن تعداد رکوردها با TOP در SQL Server

1️⃣ مقدمه — چرا به TOP نیاز داریم؟
در بسیاری از مواقع پایگاه داده شامل صدها هزار یا حتی میلیونها رکورد است، اما ما فقط به بخش کوچکی از آن نیاز داریم.
مثالها:
- نمایش ۵ محصول پرفروش در صفحه اصلی سایت
- گزارش ۱۰ سفارش اخیر
- لیست ۳ کارمند برتر بر اساس عملکرد
📌 دستور TOP در SQL Server به ما امکان میدهد که تعداد رکوردهای خروجی را محدود کنیم، بدون اینکه همه رکوردها دریافت شوند.
TOP هم از نظر کارایی مفید است (کم کردن داده منتقل شده) و هم برای کنترل خروجی مهم است.
2️⃣ ساختار کلی دستور TOP
فرمت ساده:
SELECT TOP (عدد) ستونها
FROM نام_جدول;
مثال — نمایش ۵ رکورد اول جدول سفارشها:
SELECT TOP (5) OrderID, CustomerID, OrderDate
FROM Orders;
📌 اگر ORDER BY نداشته باشیم، این رکوردها بر اساس ترتیب داخلی جدول و بدون تضمین خاصی برمیگردند.
برای نتیجه قابل پیشبینی، بهتر است همیشه همراه ORDER BY استفاده شود.
3️⃣ استفاده از TOP با ORDER BY
مرتبط کردن TOP با مرتبسازی باعث میشود که دقیقاً رکوردهای خاصی بیایند:
مثال — ۳ سفارش اخیر:
SELECT TOP (3) OrderID, CustomerID, OrderDate
FROM Orders
ORDER BY OrderDate DESC;
📌 اگر به جای DESC، ASC میگذاشتیم، سه سفارش قدیمیترین برمیگشتند.
4️⃣ استفاده از TOP بدون پرانتز و با پرانتز
در SQL Server، امکان نوشتن TOP هم بدون پرانتز و هم با پرانتز هست:
-- بدون پرانتز
SELECT TOP 10 * FROM Customers;
-- با پرانتز
SELECT TOP (10) * FROM Customers;
📌 استفاده از پرانتز توصیه میشود، چون برای حالتهای پیشرفته مثل استفاده از متغیر ضروری است.
5️⃣ استفاده از TOP همراه با درصد (%)
گاهی لازم داریم درصدی از رکوردها را برگردانیم:
SELECT TOP (20) PERCENT *
FROM Products
ORDER BY Price DESC;
📌 این کوئری ۲۰٪ بالای جدول را بر اساس قیمت میآورد.
⚠ نکته: وقتی از PERCENT استفاده میکنید، همیشه ORDER BY بگذارید تا درصد درست محاسبه شود.
6️⃣ استفاده از TOP با متغیر
مثال — محدود کردن خروجی بر اساس عددی که کاربر وارد میکند:
DECLARE @Count INT = 5;
SELECT TOP (@Count) *
FROM Customers
ORDER BY FullName ASC;
📌 این روش برای ساخت گزارشهای پویا کاربرد دارد.
7️⃣ ترکیب TOP با WHERE
گاهی یک شرط خاص داریم و بعد از فیلتر کردن، خروجی را محدود میکنیم:
SELECT TOP (10) *
FROM Orders
WHERE Status = 'Pending'
ORDER BY OrderDate DESC;
📌 اینجا ۱۰ سفارش در انتظار، بر اساس جدیدترین تاریخ نمایش داده میشوند.
8️⃣ استفاده از TOP در کوئریهای پیچیده و Subquery
مثال — پیدا کردن گرانترین محصول:
SELECT *
FROM Products
WHERE Price = (
SELECT TOP (1) Price
FROM Products
ORDER BY Price DESC
);
📌 این روش برای گرفتن یک رکورد خاص بر اساس ترتیب محبوب است.
9️⃣ عملگر WITH TIES در TOP
گاهی میخواهیم علاوه بر رکوردهای محدود، رکوردهایی که مشابه رکورد آخر در مرتبسازی هستند هم بیایند.
مثال — ۳ محصول گران ولی با قیمت مساوی:
SELECT TOP (3) WITH TIES Name, Price
FROM Products
ORDER BY Price DESC;
📌 اگر محصول چهارم هم همان قیمت محصول سوم را داشته باشد، اضافه میشود.
🔟 مزایا و معایب استفاده از TOP
✅ مزایا:
- کاهش حجم داده خروجی
- افزایش سرعت پاسخگویی کوئریها
- مناسب برای گزارشگیری و تست
❌ معایب / محدودیتها:
- بدون ORDER BY خروجی قابل پیشبینی نیست
- درصدی بودن (PERCENT) در دادههای کوچک دقیق نیست
- گاهی نیاز به روشهای صفحهبندی دارد
1️⃣1️⃣ نکات بهینهسازی TOP
- همیشه در گزارشهای TOP همراه با ORDER BY استفاده کنید تا نتیجه قابل تکرار باشد.
- در جداول بزرگ، ستون مرتبسازی را ایندکس کنید.
- توجه داشته باشید که TOP فقط رکوردهای خروجی را محدود میکند، اما کوئری داخلی ممکن است هنوز تمام دادهها را بررسی کند (مگر با ایندکس و شرایط بهینه).
1️⃣2️⃣ سناریوهای واقعی استفاده از TOP
سناریو ۱ — نمایش آخرین اخبار
SELECT TOP (5) NewsID, Title, PublishDate
FROM News
ORDER BY PublishDate DESC;
سناریو ۲ — لیست کاربران جدید
SELECT TOP (10) UserID, FullName, RegisterDate
FROM Users
ORDER BY RegisterDate DESC;
سناریو ۳ — ۱۰ محصول ارزان
SELECT TOP (10) Name, Price
FROM Products
ORDER BY Price ASC;
سناریو ۴ — درصدی از رکوردها برای تست
SELECT TOP (5) PERCENT *
FROM Orders
ORDER BY NEWID(); -- مرتبسازی تصادفی
1️⃣3️⃣ اشتباهات رایج مبتدیها
- عدم استفاده از ORDER BY → نتایج هر بار متفاوت میشود.
- نوشتن TOP در کوئری بدون توجه به ایندکسها → عملکرد ضعیف روی جداول بزرگ.
- تاپ درصدی بدون درک تفاوتها → در جداول کوچک باعث نتایج عجیب میشود.
- استفاده نادرست از WITH TIES → برگرداندن بیش از حد رکوردها.
1️⃣4️⃣ تمرین عملی
- ساخت کوئری که ۵ سفارش اخیر را نشان دهد.
- نمایش ۳ کارمند برتر بر اساس تعداد فروش.
- یافتن گرانترین محصول با Subquery و TOP.
- نمایش ۲۰٪ بالا از لیست مشتریان بر اساس سابقه خرید.
- تست WITH TIES با قیمت محصولات.
1️⃣5️⃣ جمعبندی
در این فصل یاد گرفتید:
- ساختار و کاربرد اصلی TOP
- استفاده همراه با ORDER BY، PERCENT، WITH TIES
- کاربرد TOP در Subqueryها
- نکات عملکرد و بهینهسازی
- سناریوهای واقعی در پروژهها
📌 به یاد داشته باشید:
همیشه نتیجه TOP وابسته به مرتبسازی است، پس بدون ORDER BY نباید انتظار نتیجه ثابت داشت.