LIMIT في عدد الصفوف المُعادة في نتائج الاستعلام. يمكن تحديد الصفوف بالعدد والإزاحة، أو عبر الشروط التي تفتح وتغلق نطاقًا من الصفوف باستخدام LIMIT ... AFTER ... UNTIL.
صيغة أساسية
اختيار الصفوف الأولى:m صفوف من النتيجة، أو كل السجلات إذا كان عددها أقل من m.
صيغة TOP البديلة (متوافقة مع MS SQL Server):
LIMIT m، ويمكن استخدامه للتوافق مع استعلامات Microsoft SQL Server.
الاختيار مع الإزاحة:
n من الصفوف، ثم يعيد الصفوف m التالية.
في كلتا الصيغتين، يجب أن يكون n و m عددين صحيحين غير سالبين.
اختيار نطاق حسب الشروط:
start_expr صحيحة، أو من بداية الدفق عند حذف AFTER، وحتى أول صف عند تلك البداية أو بعدها تكون فيه end_expr صحيحة، دون تضمينه؛ ويحدد n طول ذلك النطاق. يفتح AFTER start_expr ALL نطاقًا عند كل صف مطابق. راجع LIMIT … AFTER … UNTIL أدناه.
الحدود السالبة
حدِّد الصفوف من نهاية مجموعة النتائج باستخدام قيم سالبة:
صيغة
LIMIT -n, -m مكافئة لـ LIMIT -m OFFSET -n.
حدود LIMIT الكسرية
استخدم قيمًا عشرية بين 0 و1 لتحديد نسبة مئوية من الصفوف:- يجب أن تكون القيم الكسرية من النوع Float64، وأكبر من 0 وأقل من 1.
- تُقرَّب أعداد الصفوف الكسرية إلى العدد الصحيح التالي.
الجمع بين أنواع LIMIT
يمكنك الجمع بين الأعداد الصحيحة العادية والإزاحات الكسرية أو السالبة:LIMIT 3 AFTER start_expr ثلاثة صفوف كحد أقصى من نقطة بدء النطاق. تُرفض OFFSET والأعداد الكسرية والسالبة وWITH TIES مع AFTER أو UNTIL. يمكن أن تسبق عبارة LIMIT BY نطاقًا في الاستعلام نفسه، ويظل إعداد limit يقيّد النتيجة.
LIMIT … WITH TIES
يضمّ المعدِّلWITH TIES صفوفًا إضافية تحمل قيم ORDER BY نفسها التي يحملها الصف الأخير ضمن الحد. وينطبق على حدود العدد والإزاحة فقط، ولا يمكن دمجه مع صيغة النطاق.
WITH TIES، تُدرَج جميع الصفوف التي تطابق القيمة الأخيرة:
2) التي في الصف 5.
وينطبق الأمر نفسه عند تحديد الإزاحة باستخدام الكلمة المفتاحية OFFSET:
1, 1, 2، لكن أُدرِجت القيمة 2 الثانية أيضًا لأنها مساوية للصف الأخير.
يعمل WITH TIES أيضًا مع القيم السالبة في LIMIT وOFFSET. ويضمّ صفوفًا إضافية تحمل قيم ORDER BY نفسها التي يحملها أول صف محدد:
WITH TIES، ستكون النتيجة 1, 1, 2, 2. وعند استخدام WITH TIES، تُدرَج ثلاثة صفوف إضافية بالقيمة 1 لأنها تتساوى مع أول صف مُحدَّد.
يمكن دمج هذا المُعدِّل مع المُعدِّل ORDER BY ... WITH FILL.
LIMIT … AFTER … UNTIL (نطاق حسب الشرط)
يمكنك حصر النتيجة في نطاق من الصفوف يقع بين شرطَي boundary:AFTER start_expr: ابدأ الإخراج من أول صف تكون فيهstart_exprصحيحة (ويُضمَّن هذا الصف).AFTER start_expr ALL: أخرج اتحاد جميع النطاقات المطابقة التي تبدأ عند تحققstart_expr، من دون تكرار الصفوف عند تداخل النطاقات.UNTIL end_expr: أنهِ كل نطاق قبل أول صف عند بدايته أو بعدها تكون فيهend_exprصحيحة (ويُستبعد هذا الصف).n: عدد صفوف اختياري. من دونALL، يمثّل الحد الأقصى لطول النطاق المفتوح الواحد. معAFTER ... ALL، يمثّل طول كل نطاق مفتوح، لذا قد يتجاوز إجمالي النتيجةn(على سبيل المثال، قد يعيدLIMIT 2 AFTER number IN (2, 6) ALLما يصل إلى أربعة صفوف). لفرض حد أقصى على إجمالي عدد صفوف النتيجة، استخدم إعدادlimit، الذي يُطبَّق كحد عام بعد النطاق.
ORDER BY للتحكم فيه.
لا أثر لمطابقات UNTIL التي تسبق بدء النطاق. وإذا طابق الشرطان الصفَّ الذي يبدأ عنده النطاق، يكون النطاق فارغًا. وإذا لم تحدث أي مطابقة لـ UNTIL عند البداية أو بعدها، يستمر النطاق حتى بلوغه عدد صفوفه n أو حتى نهاية الدفق. مع AFTER ... ALL، يمكن لمطابقات AFTER اللاحقة أن تفتح نطاقات جديدة بعد انتهاء نطاق سابق.
مع AFTER ومن دون ALL، تقيّم خطوة النطاق شرط AFTER إلى أن تعثر على مقطع يحتوي على مطابقة بداية. ثم تقيّم UNTIL في ذلك المقطع وفي المقاطع التالية ما دام النطاق مفتوحًا. وتُقيَّم التعبيرات على المقاطع بكاملها، لذا قد يظل UNTIL يُقيَّم للصفوف السابقة للبداية داخل مقطع البداية.
إذا احتوى UNTIL على دوال ذات حالة مثل rowNumberInAllBlocks، أو دوال غير حتمية ضمن الاستعلام، فإنه يُقيَّم بدءًا من المقطع الأول للحفاظ على سلوك تلك الدوال. ومن دون ALL، يُقيَّم AFTER حتى مقطع البداية فقط؛ أما المقاطع التالية فتقيّم UNTIL وحده. ويبقى أن مطابقات النهاية السابقة للبداية لا أثر لها.
أمثلة:
أول 3 صفوف بدءًا من أول صف تكون فيه number >= 3:
number >= 2 وحتى (غير شامل) أول صف يكون فيه number >= 6:
n، تُعاد جميع الصفوف بدءًا من تطابق AFTER وحتى نهاية الدفق (أو حتى UNTIL):
n ولكن مع UNTIL، يمتد النطاق من أول تطابق لـ AFTER حتى أول تطابق لـ UNTIL يقع عنده أو بعده:
UNTIL يسبق البداية؛ فهنا لا أثر لـ number = 1، وينتهي النطاق قبل number = 6:
ALL وUNTIL، ينتهي كل نطاق مفتوح عند بلوغه n من الصفوف أو عند أول تطابق تالٍ لـ UNTIL، أيهما أسبق؛ فهنا يُقطع النطاق المفتوح عند 6 بفعل number = 7:
n، يُغلق تطابق UNTIL النطاق الحالي، ويفتح تطابق AFTER لاحق نطاقًا جديدًا يمتد حتى النهاية إذا لم يتبعه تطابق UNTIL آخر:
n وUNTIL، يمتد كل نطاق مفتوح حتى نهاية الدفق، لذا يعيد AFTER start_expr ALL الصفوف نفسها التي يعيدها AFTER start_expr.
- لا يمكن استخدام
WITH TIESأوLIMIT/OFFSETالكسري أو السالب أوOFFSETمعAFTER/UNTIL. - يُعطَّل pushdown الأولي لـ
LIMITعند استخدامAFTER/UNTIL. - لا يُتعرَّف على
AFTERوUNTILككلمات مفتاحية إلا إذا تبعهما تعبير حدّي، لذا يظل المعرّف المسمىafterأوuntilصالحًا كعدد للصفوف (LIMIT after،LIMIT after BY x). وعندما يكون التفسيران ممكنين، تكون الأولوية للكلمة المفتاحية: يُفسَّرLIMIT after(2)على أنه النطاقLIMIT AFTER (2)؛ وللاستدعاء دالة باسمafter، اكتبLIMIT (after(2)).
UNTIL وحده الصفوف من بداية الدفق حتى أول صف يتحقق فيه الشرط:
n، يُرجع UNTIL بمفرده n من الصفوف كحدٍّ أقصى بدءًا من بداية الدفق، مع التوقف عند أول تطابق:
LIMIT BY، وعندئذٍ ينطبق على الصفوف التي يُبقيها LIMIT BY:
اعتبارات
نتائج غير حتمية: من دون عبارةORDER BY، قد تكون الصفوف المُعادة عشوائية وقد تختلف من تنفيذ استعلام إلى آخر.
حدّ على مستوى الخادم: يمكن أيضًا أن يتأثر عدد الصفوف المُعادة بإعداد limit.
انظر أيضًا
- LIMIT BY — يحدّ عدد الصفوف لكل مجموعة من القيم، وهو مفيد للحصول على أعلى N من النتائج ضمن كل فئة.