خانه/ وبلاگ/ آموزش ORDER BY و COUNT در SQL Server با ۱۵ مثال کاربردی
آموزش SQL

آموزش ORDER BY و COUNT در SQL Server با ۱۵ مثال کاربردی

آموزش SQL ۵ آبان ۱۴۰۵ 10 دقیقه مطالعه

ORDER BY و COUNT دو دستور پرکاربرد SQL هستند که تقریباً در هر گزارشی دیده می‌شوند. در این مقاله با ۱۵ مثال، کاربردهای معمول و نکته‌های ریز آن‌ها را مرور می‌کنیم. جدول مثال:

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

مثال ۱ — مرتب‌سازی صعودی (پیش‌فرض)

sql
SELECT FullName, Salary FROM Employees ORDER BY Salary;        -- ASC

مثال ۲ — مرتب‌سازی نزولی

sql
SELECT FullName, Salary FROM Employees ORDER BY Salary DESC;

مثال ۳ — مرتب‌سازی بر اساس چند ستون

اول بر اساس بخش، سپس در هر بخش بر اساس حقوق نزولی:

sql
SELECT Department, FullName, Salary
FROM Employees
ORDER BY Department ASC, Salary DESC;

مثال ۴ — مرتب‌سازی با شماره‌ی ستون یا Alias

sql
SELECT FullName, Salary * 12 AS YearlySalary
FROM Employees
ORDER BY YearlySalary DESC;   -- در ORDER BY می‌توان از Alias استفاده کرد

مثال ۵ — رفتار NULL

در SQL Server مقدار NULL در مرتب‌سازی صعودی اول و در نزولی آخر می‌آید. برای دلخواه کردن:

sql
SELECT FullName, City
FROM Employees
ORDER BY CASE WHEN City IS NULL THEN 1 ELSE 0 END, City;   -- NULLها آخر

مثال ۶ — سه حقوق بالاتر (TOP)

sql
SELECT TOP (3) FullName, Salary FROM Employees ORDER BY Salary DESC;

مثال ۷ — صفحه‌بندی با OFFSET/FETCH

sql
SELECT FullName, Salary
FROM Employees
ORDER BY Salary DESC
OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY;   -- صفحه‌ی دوم با اندازه‌ی ۲
OFFSET ... FETCH حتماً به ORDER BY نیاز دارد؛ و بدون ORDER BY ترتیب ردیف‌ها هرگز تضمین‌شده نیست.

بخش دوم: COUNT

مثال ۸ — تعداد همه‌ی ردیف‌ها

sql
SELECT COUNT(*) AS Total FROM Employees;        -- 6

مثال ۹ — COUNT(ستون) و NULL

sql
SELECT COUNT(City) AS WithCity FROM Employees;  -- 4 (دو NULL شمرده نمی‌شود)

مثال ۱۰ — تعداد مقدارهای متفاوت

sql
SELECT COUNT(DISTINCT Department) AS DeptCount FROM Employees;  -- 3

مثال ۱۱ — شمارش با شرط

sql
SELECT COUNT(*) AS ITCount FROM Employees WHERE Department = N'IT';  -- 3

مثال ۱۲ — تعداد در هر گروه

sql
SELECT Department, COUNT(*) AS Cnt
FROM Employees
GROUP BY Department;
DepartmentCnt
IT3
HR1
Sales2

بخش سوم: ترکیب ORDER BY و COUNT

مثال ۱۳ — پرتکرارترین مقدار

sql
SELECT TOP (1) Department, COUNT(*) AS Cnt
FROM Employees
GROUP BY Department
ORDER BY COUNT(*) DESC;

مثال ۱۴ — گروه‌هایی با حداقل ۲ عضو، مرتب‌شده

sql
SELECT Department, COUNT(*) AS Cnt
FROM Employees
GROUP BY Department
HAVING COUNT(*) >= 2
ORDER BY Cnt DESC, Department;

مثال ۱۵ — شمارش مشروط با CASE

sql
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؛ مرتب‌سازی را در پرس‌وجوی نهایی انجام بده.

مصطفی موسویسازنده و نویسنده‌ی SQLFarsi. اگر اشتباهی در مقاله دیدی یا پیشنهادی داری، از طریق mousavi.dev خبر بده.

می‌خوای SQL را از پایه و با تمرین یاد بگیری؟

دوره‌ی رایگان SQLFarsi را با Playground و پروژه‌های واقعی دنبال کن.

شروع یادگیری