0Pricing
Coding Interview Prep · درس

LIMIT وOFFSET وFETCH FIRST

صياغة تقسيم الصفحات في MySQL وPostgres وSQL Server

LIMIT وOFFSET وFETCH FIRST درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

Pagination سؤال يعتمد على لهجة SQL

يبدو السؤال «كيف تحصل على أول 10 صفوف؟» بسيطًا، إلى أن يضيف المحاور «وبصيغة SQL القياسية؟» أو «والآن باستخدام SQL Server؟». وتُعد صياغة تحديد عدد الصفوف من أكثر الميزات اختلافًا بين قواعد البيانات.

يعرض هذا الدرس الصيغ الرئيسية الثلاث: LIMIT في MySQL وPostgreSQL وSQLite، وOFFSET ... FETCH في معيار ANSI وSQL Server، وTOP الأقدم في SQL Server.

LIMIT في MySQL وPostgreSQL

الصيغة الأكثر شيوعًا هي LIMIT n، التي تحدد عدد النتائج بحد أقصى قدره n من الصفوف. وتدعمها MySQL وPostgreSQL وSQLite.

والأهم أن تطبيق LIMIT يحدث بعد ORDER BY وفق ترتيب التنفيذ المنطقي، ولذلك غالبًا ما تستخدمهما معًا. أما تحديد العدد من دون ترتيب، فيعيد مجموعة عشوائية من الصفوف.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10;

استخدام OFFSET لتجاوز الصفوف

تحتاج عملية Pagination إلى إزاحة لتجاوز الصفحات السابقة. إذ يتجاوز OFFSET m أول m صفوف قبل تطبيق الحد.

للحصول على الصفحة الثالثة بحجم 10 صفوف، تتجاوز 20 صفًا وتأخذ 10 صفوف. والصيغة العامة هي OFFSET = (page - 1) * page_size.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 10 OFFSET 20;

صيغة الفواصل في MySQL

تقبل MySQL أيضًا صيغة الفاصلة ذات الوسيطين: LIMIT offset, count. لاحظ أن الترتيب فيها معكوس مقارنةً بصيغة الكلمات المفتاحية، وهذا ما يربك بعض الأشخاص.

تعني LIMIT 20, 10 تجاوز 20 صفًا ثم أخذ 10 صفوف، وهي مطابقة لـ LIMIT 10 OFFSET 20. ويفضّل استخدام صيغة الكلمات المفتاحية لوضوحها في المقابلات.

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 20, 10;

المعيار ANSI: FETCH FIRST

يستخدم معيار SQL الصيغة OFFSET ... ROWS FETCH FIRST ... ROWS ONLY. وتدعمها PostgreSQL وOracle 12c+ وDB2 وSQL Server 2012+.

تبدو الصيغة مطوّلة، لكنها الخيار القابل للنقل بين الأنظمة. ويمكن استخدام ROW وROWS بالتبادل، كما أن FIRST وNEXT مترادفان.

SELECT name, salary
FROM employees
ORDER BY salary DESC
OFFSET 20 ROWS
FETCH FIRST 10 ROWS ONLY;

TOP في SQL Server

تستخدم شيفرة SQL Server القديمة TOP n مباشرةً بعد SELECT. ولا تتضمن إزاحة مدمجة، لذلك لا يمكنها ترقيم الصفحات بعد الصفحة الأولى بمفردها.

قد يطلب منك القائم بإجراء المقابلة تحويل TOP إلى الصيغة القياسية. فـ SELECT TOP 10 مع ORDER BY يعادل FETCH FIRST 10 ROWS ONLY.

SELECT TOP 10 name, salary
FROM employees
ORDER BY salary DESC;

TOP WITH TIES

من ميزات SQL Server المفيدة أن TOP n WITH TIES يعيد صفوفًا إضافية عندما تتعادل مع الصف الأخير وفق مفتاح ORDER BY.

إذا كان ثلاثة أشخاص يتقاضون الراتب نفسه الذي يحتل المرتبة العاشرة من حيث الارتفاع، فإن TOP 10 WITH TIES يعيدهم جميعًا، وقد يعيد 12 صفًا. وهذا هو المكافئ لـ FETCH FIRST ... WITH TIES في المعيار.

SELECT TOP 10 WITH TIES name, salary
FROM employees
ORDER BY salary DESC;

ORDER BY إلزامي لترقيم الصفحات الحتمي

أهم نقطة في المقابلة هنا: يُعد OFFSET/LIMIT من دون ORDER BY حتمي غير آمن. فقد يختار المحرك صفوفًا مختلفة لـ "الصفحة 2" عن تلك التي اختارها لـ "الصفحة 1"، لأن الترتيب الأساسي غير محدد.

رتّب دائمًا باستخدام مجموعة مفاتيح فريدة أو تكاد تكون فريدة. وإذا كان عمود الفرز يحتوي على قيم مكررة، فأضف المفتاح الأساسي كمفتاح فاصل حتى لا تتداخل الصفحات أو تتخطى صفوفًا.

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 10 OFFSET 20;

لماذا يتوسع ترقيم الصفحات باستخدام OFFSET على نحو سيئ

يتحقق المحاورون ذوو الخبرة من فهمك للأداء. فقيمة OFFSET الكبيرة تجبر قاعدة البيانات على إنشاء جميع الصفوف المتخطاة والتخلص منها. ويقرأ OFFSET 100000 LIMIT 10 عدد 100,010 صفوف لإرجاع 10 صفوف.

تزداد التكلفة خطيًا مع رقم الصفحة، مما يجعل ترقيم الصفحات العميق بطيئًا في الجداول الكبيرة.

ترقيم الصفحات بالمفتاح (Seek)

البديل القابل للتوسع هو ترقيم الصفحات بالمفتاح: بدلًا من التخطي حسب العدد، تصفّي النتائج بعد آخر قيمة رأيتها. ويستخدم هذا فحص نطاق الفهرس، ويحافظ على سرعته مهما كان عمق الصفحة.

تتذكر مفتاح ترتيب الصف الأخير من الصفحة السابقة، وتطلب الصفوف التي تليه. وذكر ترقيم الصفحات بالمفتاح يُعد مؤشرًا قويًا على مستوى متقدم.

SELECT id, name, created_at
FROM events
WHERE created_at < '2026-01-01 10:00:00'
ORDER BY created_at DESC
LIMIT 10;

مرجع سريع حسب اللهجة

احفظ هذا الجدول لاسترجاع المعلومات سريعًا في المقابلة:

  • MySQL / Postgres / SQLite: LIMIT n OFFSET m
  • Standard / SQL Server 2012+ / Oracle 12c+: OFFSET m ROWS FETCH FIRST n ROWS ONLY
  • SQL Server القديم: SELECT TOP n (من دون إزاحة)
  • Oracle القديم (قبل 12c): التصفية باستخدام ROWNUM في استعلام فرعي

اختبار سريع

اختر الاستعلام الصحيح للصفحة 3 عند استخدام حجم صفحة قدره 10.

خلاصة

أساسيات ترقيم الصفحات:

  • LIMIT/OFFSET في MySQL وPostgres وSQLite؛ وOFFSET ... FETCH FIRST في المعيار وSQL Server الحديث؛ وTOP في SQL Server القديم.
  • OFFSET = (page - 1) * page_size.
  • اربطها دائمًا بعبارة ORDER BY حتمية، مع إضافة مفتاح فاصل فريد.
  • الإزاحات الكبيرة بطيئة؛ لذا يُفضَّل استخدام ترقيم الصفحات بالمفتاح عند ترقيم الصفحات العميق.

الأسئلة الشائعة

هل درس «LIMIT وOFFSET وFETCH FIRST» مجاني؟

نعم — نص درس «LIMIT وOFFSET وFETCH FIRST» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «LIMIT وOFFSET وFETCH FIRST»؟

صياغة تقسيم الصفحات في MySQL وPostgres وSQL Server تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟

لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «LIMIT وOFFSET وFETCH FIRST»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟

نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الترتيب حسب عدة أعمدة ووضع NULL
  2. LIMIT وOFFSET وFETCH FIRST
  3. إرجاع صفوف Top-N بشكل موثوق
  4. الترتيب حسب التعبيرات والأسماء المستعارة
← العودة إلى Coding Interview Prep