بهینهسازی نمایش نتایج در SQL: راهنمای جامع دستور ORDER BY با مثالهای عملی
دستور ORDER BY در SQL برای مرتبسازی مجموعه نتایج (result-set) یک کوئری استفاده میشود. این دستور به شما امکان میدهد تا دادهها را بر اساس یک یا چند ستون، به ترتیب صعودی یا نزولی، مرتب کنید. اگر ترتیب مرتبسازی مشخص نشود، به طور پیشفرض صعودی (ASC) خواهد بود.
در ادامه، با مثالهای متنوع، نحوه استفاده از دستور ORDER BY در سناریوهای مختلف را بررسی میکنیم. برای این مثالها، یک جدول با دادههای نمونه ایجاد میکنیم.
جدول `Employee` و دادههای نمونه را با کد زیر ایجاد میکنیم:
CREATE TABLE Employee (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Department VARCHAR(50),
Salary DECIMAL(10, 2),
HireDate DATE,
Commission DECIMAL(10, 2)
);
INSERT INTO Employee (EmployeeID, FirstName, LastName, Department, Salary, HireDate, Commission) VALUES
(1, 'جان', 'دو', 'فروش', 60000.00, '2020-01-15', 5000.00),
(2, 'مریم', 'اسمیت', 'بازاریابی', 55000.00, '2019-03-20', NULL),
(3, 'احمد', 'محمدی', 'فروش', 70000.00, '2021-06-01', 7500.00),
(4, 'سارا', 'کریمی', 'فناوری اطلاعات', 80000.00, '2018-11-10', NULL),
(5, 'علی', 'رضایی', 'منابع انسانی', 50000.00, '2022-02-28', NULL),
(6, 'فاطمه', 'جعفری', 'فروش', 62000.00, '2020-09-01', 6000.00),
(7, 'حسین', 'نوری', 'بازاریابی', 58000.00, '2019-07-05', 4000.00),
(8, 'زینب', 'حسینی', 'فناوری اطلاعات', 85000.00, '2017-04-22', 10000.00),
(9, 'محمد', 'کرمی', 'فروش', 65000.00, '2021-01-01', NULL),
(10, 'لیلا', 'ابراهیمی', 'منابع انسانی', 52000.00, '2022-11-15', NULL),
(11, 'امین', 'نیکزاد', 'فروش', 63000.00, '2020-05-10', 5500.00),
(12, 'میترا', 'محمودی', 'بازاریابی', 56000.00, '2019-10-01', NULL);
برای مشاهده تمام دادههای جدول `Employee`، از کوئری زیر استفاده کنید:
SELECT * FROM Employee;
در ادامه، به مثالهای عملی مرتبسازی با ORDER BY میپردازیم:
**۱. مرتبسازی بر اساس یک ستون (پیشفرض صعودی)**
این مثال دادهها را بر اساس نام خانوادگی (`LastName`) به ترتیب صعودی مرتب میکند. به طور پیشفرض، اگر `ASC` یا `DESC` مشخص نشود، مرتبسازی صعودی انجام میشود.
SELECT FirstName, LastName, Department FROM Employee ORDER BY LastName;
**۲. مرتبسازی بر اساس یک ستون (صعودی صریح)**
برای اطمینان از مرتبسازی صعودی، میتوانید کلمه کلیدی `ASC` را به صراحت ذکر کنید. این کوئری نیز دادهها را بر اساس نام خانوادگی به ترتیب صعودی مرتب میکند.
SELECT FirstName, LastName, Department FROM Employee ORDER BY LastName ASC;
**۳. مرتبسازی بر اساس یک ستون (نزولی)**
این مثال دادهها را بر اساس ستون حقوق (`Salary`) به ترتیب نزولی مرتب میکند.
SELECT FirstName, LastName, Salary FROM Employee ORDER BY Salary DESC;
**۴. مرتبسازی بر اساس چندین ستون**
شما میتوانید نتایج را بر اساس چندین ستون مرتب کنید. این کوئری ابتدا بر اساس دپارتمان (`Department`) به ترتیب صعودی و سپس بر اساس نام خانوادگی (`LastName`) به ترتیب صعودی مرتبسازی میکند.
SELECT FirstName, LastName, Department FROM Employee ORDER BY Department ASC, LastName ASC;
**۵. مرتبسازی بر اساس موقعیت ستون**
میتوانید به جای نام ستون، از موقعیت عددی آن در لیست `SELECT` استفاده کنید. این مثال نتایج را بر اساس دپارتمان (ستون سوم) و سپس نام خانوادگی (ستون دوم) مرتب میکند.
SELECT FirstName, LastName, Department FROM Employee ORDER BY 3 ASC, 2 ASC;
**۶. مرتبسازی بر اساس یک عبارت (Expression)**
این روش به شما امکان میدهد تا بر اساس نتایج یک محاسبه یا تابع مرتبسازی کنید. این کوئری کارمندان را بر اساس مجموع حقوق و کمیسیونشان به ترتیب نزولی مرتب میکند. ستون `Commission` ممکن است مقادیر `NULL` داشته باشد، بنابراین `ISNULL` برای جایگزینی `NULL` با صفر استفاده شده است.
SELECT FirstName, LastName, Salary, Commission, (Salary + ISNULL(Commission, 0)) AS TotalCompensation
FROM Employee
ORDER BY (Salary + ISNULL(Commission, 0)) DESC;
**۷. مرتبسازی با استفاده از CASE WHEN**
با استفاده از دستور `CASE WHEN`، میتوانید منطق مرتبسازی پیچیدهتری را اعمال کنید. این مثال ابتدا کارمندان دپارتمان ‘فروش’ را نمایش میدهد و سپس بقیه را بر اساس نام خانوادگی مرتب میکند.
SELECT FirstName, LastName, Department FROM Employee
ORDER BY
CASE
WHEN Department = 'فروش' THEN 1
ELSE 2
END ASC,
LastName ASC;
**۸. مدیریت مقادیر NULL در مرتبسازی (NULLS LAST)**
در SQL Server، به طور پیشفرض `NULL` ها در ترتیب صعودی (ASC) قبل از مقادیر غیر `NULL` و در ترتیب نزولی (DESC) بعد از مقادیر غیر `NULL` قرار میگیرند. برای کنترل صریح محل قرارگیری `NULL` ها، میتوانید از `NULLS LAST` یا `NULLS FIRST` استفاده کنید. این مثال کمیسیونها را به ترتیب صعودی مرتب میکند و مقادیر `NULL` را در انتها قرار میدهد.
SELECT FirstName, LastName, Commission FROM Employee
ORDER BY Commission ASC NULLS LAST;
**۹. مرتبسازی با TOP**
دستور `TOP` همراه با `ORDER BY` برای محدود کردن تعداد ردیفهای بازگشتی پس از مرتبسازی استفاده میشود. این مثال ۱۰ کارمند با بالاترین حقوق را بر اساس حقوقشان به ترتیب نزولی برمیگرداند.
SELECT TOP 10 FirstName, LastName, Salary FROM Employee ORDER BY Salary DESC;
**۱۰. مرتبسازی با OFFSET و FETCH NEXT**
این دستورات برای صفحهبندی (pagination) نتایج استفاده میشوند. `OFFSET` تعداد ردیفهایی را که باید نادیده گرفته شوند مشخص میکند و `FETCH NEXT` تعداد ردیفهای بعدی را برای بازگرداندن تعیین میکند. این مثال ۵ کارمند را بعد از نادیده گرفتن ۳ کارمند اول، بر اساس تاریخ استخدام به ترتیب صعودی برمیگرداند.
SELECT EmployeeID, FirstName, LastName, HireDate
FROM Employee
ORDER BY HireDate ASC
OFFSET 3 ROWS FETCH NEXT 5 ROWS ONLY;
این مثالهای جامع، رویکردهای کلیدی برای استفاده موثر از دستور ORDER BY در SQL را پوشش میدهند و به شما کمک میکنند تا دادهها را دقیقاً به شکلی که نیاز دارید، مرتب و نمایش دهید.