SQL TOP, LIMIT, FETCH FIRST or ROWNUM Clause

🔹 چرا نیاز داریم؟

گاهی فقط می‌خواهیم چند ردیف اول از نتایج را ببینیم (مثلاً ۱۰ مشتری برتر یا آخرین سفارش‌ها).
در SQL، این کار بسته به نوع پایگاه داده (DBMS) متفاوت انجام می‌شود.

🔹 1️⃣ SQL Server → TOP

SELECT TOP 5 * FROM Customers;

🔹 فقط 5 ردیف اول برمی‌گرداند.

با شرط:

SELECT TOP 10 Name, City FROM Customers WHERE City = 'Tehran';

🔹 2️⃣ MySQL و PostgreSQL → LIMIT

SELECT * FROM Customers LIMIT 5;

🔹 5 ردیف اول برمی‌گرداند.

با offset (پرش از رکوردهای اول):

SELECT * FROM Customers LIMIT 5 OFFSET 10;

🔹 از ردیف 11 شروع کرده و 5 ردیف برمی‌گرداند.

🔹 3️⃣ Oracle → ROWNUM

SELECT * FROM Customers WHERE ROWNUM <= 5;

🔹 فقط 5 ردیف اول را نمایش می‌دهد.

در Oracle جدیدتر (۱۲c به بعد):

SELECT * FROM Customers FETCH FIRST 5 ROWS ONLY;

🔹 4️⃣ استاندارد SQL → FETCH FIRST

SELECT * FROM Customers ORDER BY CustomerID FETCH FIRST 5 ROWS ONLY;

🔹 در DBMSهایی مثل DB2, Oracle 12c+, PostgreSQL پشتیبانی می‌شود.

🔹 مقایسه سریع (Cheat Sheet)

DBMSدستورمثال
SQL ServerTOP (n)SELECT TOP 5 * FROM T;
MySQLLIMIT nSELECT * FROM T LIMIT 5;
PostgreSQLLIMIT n OFFSET mSELECT * FROM T LIMIT 5;
Oracle قدیمیROWNUMWHERE ROWNUM <= 5
Oracle 12c+FETCH FIRST n ROWS ONLYSELECT * FETCH FIRST 5 ROWS ONLY;
استاندارد SQLFETCH FIRST n ROWS ONLYهمان بالا

🔹 مثال کاربردی: 3 مشتری با بالاترین سفارش

(SQL Server مثال)

SELECT TOP 3 CustomerID, SUM(Amount) AS TotalOrders FROM Orders GROUP BY CustomerID ORDER BY TotalOrders DESC;

(MySQL مثال)

SELECT CustomerID, SUM(Amount) AS TotalOrders FROM Orders GROUP BY CustomerID ORDER BY TotalOrders DESC LIMIT 3;