📚 فصل ۲۰ — مرتبسازی دادهها با ORDER BY در SQL Server

1️⃣ مقدمه — چرا مرتبسازی دادهها مهم است؟
وقتی دادهها را از پایگاه داده برمیگردانیم، معمولاً به ترتیب خاصی نیاز داریم. مثلاً:
- لیست محصولات از ارزان به گران
- مشتریان به ترتیب نام خانوادگی
- سفارشها بر اساس تاریخ ثبت، از جدید به قدیم
📌 دستور ORDER BY ابزار اصلی مرتبسازی در SQL Server است.
2️⃣ ساختار پایه ORDER BY
SELECT ستونها
FROM جدول
ORDER BY ستون [ASC | DESC];
- ASC → صعودی (کم به زیاد، پیشفرض)
- DESC → نزولی (زیاد به کم)
3️⃣ مرتبسازی بر اساس یک ستون
مثال — مرتبسازی مشتریان بر اساس نام:
SELECT CustomerID, FullName, City
FROM Customers
ORDER BY FullName ASC;
مثال — مرتبسازی محصولات بر اساس قیمت نزولی:
SELECT ProductID, Name, Price
FROM Products
ORDER BY Price DESC;
4️⃣ مرتبسازی بر اساس چند ستون
وقتی میخواهیم ترتیب دوم داشته باشیم:
SELECT FullName, City
FROM Customers
ORDER BY City ASC, FullName ASC;
📌 ابتدا شهر مرتب میشود، اگر دو نفر در یک شهر باشند، بر اساس نام مرتب میشوند.
5️⃣ مرتبسازی بر اساس ستون محاسبهشده
میتوان بر اساس نتیجه یک محاسبه مرتب کرد:
SELECT Name, Price, Stock, (Price * Stock) AS TotalValue
FROM Products
ORDER BY TotalValue DESC;
6️⃣ مرتبسازی بر اساس شماره ستون
(خوشخوان نیست ولی امکانپذیر است)
SELECT Name, Price, Stock
FROM Products
ORDER BY 2 DESC;
📌 ستون دوم یعنی Price مرتب میشود.
⚠ توصیه: از شماره ستون کمتر استفاده کنید، چون اگر ترتیب ستونها تغییر کند ممکن است نتیجه تغییر کند.
7️⃣ ترکیب ORDER BY با WHERE
SELECT FullName, City
FROM Customers
WHERE City = N'تهران'
ORDER BY FullName ASC;
📌 اول دادهها فیلتر میشوند، سپس مرتبسازی انجام میشود.
8️⃣ استفاده از TOP همراه با ORDER BY
نمایش اولین ۱۰ محصول گران:
SELECT TOP 10 Name, Price
FROM Products
ORDER BY Price DESC;
📌 اگر ORDER BY نباشد، نتایج نامرتب هستند.
9️⃣ مرتبسازی متنهای فارسی و انگلیسی (Collation)
مرتبسازی بر اساس Collation تعریفشده ستون:
SELECT FullName
FROM Customers
ORDER BY FullName COLLATE Persian_100_CS_AS;
📌 میتوانید ترتیب فارسی یا انگلیسی را کنترل کنید.
🔟 نکات حرفهای برای عملکرد بهتر
- ستونهایی که زیاد در ORDER BY استفاده میشوند بهتر است ایندکس داشته باشند.
- مرتبسازی روی ستون محاسبهشده کندتر است، مگر اینکه Computed Column Indexed باشد.
- اگر داده زیاد است، خروجی مرتبسازی را Pagination کنید.
1️⃣1️⃣ مثالهای حرفهای
مثال ۱ — سفارشها از جدید به قدیم و سپس مبلغ:
SELECT OrderID, OrderDate, Amount
FROM Orders
ORDER BY OrderDate DESC, Amount DESC;
مثال ۲ — مشتریان بر اساس طول نام:
SELECT FullName
FROM Customers
ORDER BY LEN(FullName) ASC;
مثال ۳ — ترکیب ORDER BY با CASE برای اولویتبندی:
SELECT FullName, IsActive
FROM Customers
ORDER BY CASE IsActive WHEN 1 THEN 0 ELSE 1 END, FullName ASC;
📌 مشتریان فعال اول بیایند.
1️⃣2️⃣ سناریوهای واقعی
سناریو ۱ — لیست محصولات پر فروش
SELECT ProductID, Name, TotalSales
FROM Products
ORDER BY TotalSales DESC;
سناریو ۲ — لیست کارمندان بر اساس بخش و سپس تاریخ استخدام:
SELECT EmployeeID, FullName, Department, HireDate
FROM Employees
ORDER BY Department ASC, HireDate DESC;
سناریو ۳ — مرتبسازی سفارشها بر اساس روز هفته:
SELECT OrderID, OrderDate
FROM Orders
ORDER BY DATEPART(WEEKDAY, OrderDate) ASC;
1️⃣3️⃣ اشتباهات رایج
- استفاده از ORDER BY بدون مشخص کردن ASC یا DESC و انتظار نتیجه خاص.
- مرتبسازی روی ستونهایی که نوع دادهشان رشتهای است، ولی انتظار ترتیب عددی دارید:
-- اشتباه: به صورت رشتهای مرتب میکند
SELECT Price
FROM Products
ORDER BY Price;
راه درست: اطمینان از اینکه Price یک نوع عددی است.
- استفاده از ORDER BY همراه با
%در LIKE و انتظار عملکرد سریع بدون ایندکس.
1️⃣4️⃣ تمرینهای عملی
- نمایش ۵ محصول گران اول (بر اساس قیمت).
- مرتبسازی مشتریان بر اساس نام خانوادگی و سپس نام کوچک.
- نمایش سفارشها از جدید به قدیم.
- مرتبسازی کارمندان بر اساس تعداد پروژههای انجام شده.
- نمایش لیست کالاها بر اساس موجودی، از بیشترین به کمترین.
1️⃣5️⃣ جمعبندی
در این فصل یاد گرفتید:
- ساختار ORDER BY و نحوه مرتبسازی صعودی/نزولی
- مرتبسازی بر اساس چند ستون
- مرتبسازی ستونهای محاسبهشده و شماره ستون
- ترکیب ORDER BY با WHERE و TOP
- نکات حرفهای برای بهینهسازی
- سناریوهای واقعی و تمرینهای عملی