آموزش ORDER BY و COUNT در SQL Server با ۱۵ مثال کاربردی
ORDER BY و COUNT دو دستور پرکاربرد SQL هستند که تقریباً در هر گزارشی دیده میشوند. در این مقاله با ۱۵ مثال، کاربردهای معمول و نکتههای ریز آنها را مرور میکنیم. جدول مثال:
CREATE TABLE Employees ( EmployeeId INT PRIMARY KEY, FullName NVARCHAR(50), Department NVARCHAR(30), City NVARCHAR(30) NULL, Salary INT ); INSERT INTO Employees VALUES (1, N'Ali', N'IT', N'Tehran', 900), (2, N'Sara', N'IT', N'Shiraz', 1200), (3, N'Reza', N'HR', NULL, 700), (4, N'Mina', N'Sales', N'Tehran', 800), (5, N'Omid', N'Sales', N'Tehran', 800), (6, N'Neda', N'IT', NULL, 1100);
بخش اول: ORDER BY
مثال ۱ — مرتبسازی صعودی (پیشفرض)
SELECT FullName, Salary FROM Employees ORDER BY Salary; -- ASC
مثال ۲ — مرتبسازی نزولی
SELECT FullName, Salary FROM Employees ORDER BY Salary DESC;
مثال ۳ — مرتبسازی بر اساس چند ستون
اول بر اساس بخش، سپس در هر بخش بر اساس حقوق نزولی:
SELECT Department, FullName, Salary FROM Employees ORDER BY Department ASC, Salary DESC;
مثال ۴ — مرتبسازی با شمارهی ستون یا Alias
SELECT FullName, Salary * 12 AS YearlySalary FROM Employees ORDER BY YearlySalary DESC; -- در ORDER BY میتوان از Alias استفاده کرد
مثال ۵ — رفتار NULL
در SQL Server مقدار NULL در مرتبسازی صعودی اول و در نزولی آخر میآید. برای دلخواه کردن:
SELECT FullName, City FROM Employees ORDER BY CASE WHEN City IS NULL THEN 1 ELSE 0 END, City; -- NULLها آخر
مثال ۶ — سه حقوق بالاتر (TOP)
SELECT TOP (3) FullName, Salary FROM Employees ORDER BY Salary DESC;
مثال ۷ — صفحهبندی با OFFSET/FETCH
SELECT FullName, Salary FROM Employees ORDER BY Salary DESC OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY; -- صفحهی دوم با اندازهی ۲
OFFSET ... FETCH حتماً به ORDER BY نیاز دارد؛ و بدون ORDER BY ترتیب ردیفها هرگز تضمینشده نیست.بخش دوم: COUNT
مثال ۸ — تعداد همهی ردیفها
SELECT COUNT(*) AS Total FROM Employees; -- 6
مثال ۹ — COUNT(ستون) و NULL
SELECT COUNT(City) AS WithCity FROM Employees; -- 4 (دو NULL شمرده نمیشود)
مثال ۱۰ — تعداد مقدارهای متفاوت
SELECT COUNT(DISTINCT Department) AS DeptCount FROM Employees; -- 3
مثال ۱۱ — شمارش با شرط
SELECT COUNT(*) AS ITCount FROM Employees WHERE Department = N'IT'; -- 3
مثال ۱۲ — تعداد در هر گروه
SELECT Department, COUNT(*) AS Cnt FROM Employees GROUP BY Department;
| Department | Cnt |
|---|---|
| IT | 3 |
| HR | 1 |
| Sales | 2 |
بخش سوم: ترکیب ORDER BY و COUNT
مثال ۱۳ — پرتکرارترین مقدار
SELECT TOP (1) Department, COUNT(*) AS Cnt FROM Employees GROUP BY Department ORDER BY COUNT(*) DESC;
مثال ۱۴ — گروههایی با حداقل ۲ عضو، مرتبشده
SELECT Department, COUNT(*) AS Cnt FROM Employees GROUP BY Department HAVING COUNT(*) >= 2 ORDER BY Cnt DESC, Department;
مثال ۱۵ — شمارش مشروط با CASE
SELECT COUNT(*) AS AllEmployees, COUNT(CASE WHEN Salary >= 1000 THEN 1 END) AS HighPaid, SUM(CASE WHEN City IS NULL THEN 1 ELSE 0 END) AS NoCity FROM Employees;
خطاهای معمول
- ORDER BY قبل از GROUP BY: ترتیب نوشتن عبارتها ثابت است:
WHERE → GROUP BY → HAVING → ORDER BY. - مرتبسازی بر اساس ستونی که در SELECT نیست معمولاً مجاز است، اما با
DISTINCTیاGROUP BYخطا میدهد. - فراموش کردن GROUP BY هنگام استفاده از COUNT همراه ستون معمولی (توضیح بیشتر).
همهی این مثالها را در Playground امتحان کن (بهجای TOP از LIMIT استفاده کن) و درسهای ORDER BY و COUNT را مرور کن.
سوالات متداول دربارهی این موضوع
ORDER BY بهصورت پیشفرض صعودی است یا نزولی؟
پیشفرض صعودی (ASC) است. برای ترتیب نزولی باید DESC بنویسی.
COUNT(*) و COUNT(1) فرق دارند؟
از نظر نتیجه و کارایی تفاوتی ندارند؛ هر دو تعداد ردیفها را میشمارند. COUNT(ستون) ردیفهای NULL آن ستون را نمیشمارد.
آیا ORDER BY در زیرپرسوجو و View کار میکند؟
در View و زیرپرسوجو ORDER BY مجاز نیست مگر همراه با TOP یا OFFSET؛ مرتبسازی را در پرسوجوی نهایی انجام بده.
میخوای SQL را از پایه و با تمرین یاد بگیری؟
دورهی رایگان SQLFarsi را با Playground و پروژههای واقعی دنبال کن.
شروع یادگیری