> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> توثيق لعبارة LIMIT

# LIMIT

تتحكم عبارة `LIMIT` في عدد الصفوف المُعادة في نتائج الاستعلام. يمكن تحديد الصفوف بالعدد والإزاحة، أو عبر الشروط التي تفتح وتغلق نطاقًا من الصفوف باستخدام [`LIMIT ... AFTER ... UNTIL`](#limit-after-until).

## صيغة أساسية

**اختيار الصفوف الأولى:**

```sql theme={null}
LIMIT m
```

يعيد أول `m` صفوف من النتيجة، أو كل السجلات إذا كان عددها أقل من `m`.

**صيغة TOP البديلة (متوافقة مع MS SQL Server):**

```sql theme={null}
-- SELECT TOP number|percent column_name(s) FROM table_name
SELECT TOP 10 * FROM numbers(100);
SELECT TOP 0.1 * FROM numbers(100);
```

وهذا يعادل `LIMIT m`، ويمكن استخدامه للتوافق مع استعلامات Microsoft SQL Server.

**الاختيار مع الإزاحة:**

```sql theme={null}
LIMIT m OFFSET n
-- or equivalently:
LIMIT n, m
```

يتجاوز أول `n` من الصفوف، ثم يعيد الصفوف `m` التالية.

في كلتا الصيغتين، يجب أن يكون `n` و `m` عددين صحيحين غير سالبين.

**اختيار نطاق حسب الشروط:**

```sql theme={null}
LIMIT [n] AFTER start_expr [UNTIL end_expr]
LIMIT [n] UNTIL end_expr
```

يعيد الصفوف ابتداءً من أول صف تكون فيه `start_expr` صحيحة، أو من بداية الدفق عند حذف `AFTER`، وحتى أول صف عند تلك البداية أو بعدها تكون فيه `end_expr` صحيحة، دون تضمينه؛ ويحدد `n` طول ذلك النطاق. يفتح `AFTER start_expr ALL` نطاقًا عند كل صف مطابق. راجع [LIMIT ... AFTER ... UNTIL](#limit-after-until) أدناه.

## الحدود السالبة

حدِّد الصفوف من *نهاية* مجموعة النتائج باستخدام قيم سالبة:

| الصيغة | النتيجة |
| - | - |
| `LIMIT -m` | آخر `m` صفوف |
| `LIMIT -m OFFSET -n` | آخر `m` صفوف بعد تخطي آخر `n` صفوف |
| `LIMIT m OFFSET -n` | أول `m` صفوف بعد تخطي آخر `n` صفوف |
| `LIMIT -m OFFSET n` | آخر `m` صفوف بعد تخطي أول `n` صفوف |

صيغة `LIMIT -n, -m` مكافئة لـ `LIMIT -m OFFSET -n`.

## حدود LIMIT الكسرية

استخدم قيمًا عشرية بين 0 و1 لتحديد نسبة مئوية من الصفوف:

| الصياغة | النتيجة |
| - | - |
| `LIMIT 0.1` | أول 10% من الصفوف |
| `LIMIT 1 OFFSET 0.5` | الصف الوسيط |
| `LIMIT 0.25 OFFSET 0.5` | الربيع الثالث (25% من الصفوف بعد تجاوز أول 50%) |

<Note>
  * يجب أن تكون القيم الكسرية من النوع [Float64](/ar/reference/data-types/float)، وأكبر من 0 وأقل من 1.
  * تُقرَّب أعداد الصفوف الكسرية إلى العدد الصحيح التالي.
</Note>

## الجمع بين أنواع LIMIT

يمكنك الجمع بين الأعداد الصحيحة العادية والإزاحات الكسرية أو السالبة:

```sql theme={null}
LIMIT 10 OFFSET 0.5    -- 10 rows starting from the halfway point
LIMIT 10 OFFSET -20    -- 10 rows after skipping the last 20
```

لا تُستخدم [صيغة النطاق](#limit-after-until) إلا مع عدد صحيح عادي للصفوف: يأخذ `LIMIT 3 AFTER start_expr` ثلاثة صفوف كحد أقصى من نقطة بدء النطاق. تُرفض `OFFSET` والأعداد الكسرية والسالبة و`WITH TIES` مع `AFTER` أو `UNTIL`. يمكن أن تسبق عبارة [`LIMIT BY`](/ar/reference/statements/select/limit-by) نطاقًا في الاستعلام نفسه، ويظل إعداد [`limit`](/ar/reference/settings/session-settings/other#limit) يقيّد النتيجة.

## LIMIT ... WITH TIES

يضمّ المعدِّل `WITH TIES` صفوفًا إضافية تحمل قيم `ORDER BY` نفسها التي يحملها الصف الأخير ضمن الحد. وينطبق على حدود العدد والإزاحة فقط، ولا يمكن دمجه مع [صيغة النطاق](#limit-after-until).

```sql theme={null}
SELECT * FROM (
    SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 0, 5
```

```response theme={null}
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
└───┘
```

عند استخدام `WITH TIES`، تُدرَج جميع الصفوف التي تطابق القيمة الأخيرة:

```sql theme={null}
SELECT * FROM (
    SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 0, 5 WITH TIES
```

```response theme={null}
┌─n─┐
│ 0 │
│ 0 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
```

يُدرج الصف 6 لأنه يحمل القيمة نفسها (`2`) التي في الصف 5.

وينطبق الأمر نفسه عند تحديد الإزاحة باستخدام الكلمة المفتاحية `OFFSET`:

```sql theme={null}
SELECT * FROM (
    SELECT number % 50 AS n FROM numbers(100)
) ORDER BY n LIMIT 3 OFFSET 2 WITH TIES
```

```response theme={null}
┌─n─┐
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
```

يؤدي عادةً تخطي أول صفّين وأخذ 3 إلى إرجاع `1, 1, 2`، لكن أُدرِجت القيمة `2` الثانية أيضًا لأنها مساوية للصف الأخير.

يعمل `WITH TIES` أيضًا مع القيم السالبة في `LIMIT` و`OFFSET`. ويضمّ صفوفًا إضافية تحمل قيم `ORDER BY` نفسها التي يحملها أول صف محدد:

```sql theme={null}
SELECT number % 3 AS n FROM numbers(15)
ORDER BY n LIMIT -4 OFFSET -3 WITH TIES
```

```response theme={null}
┌─n─┐
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 2 │
│ 2 │
└───┘
```

من دون `WITH TIES`، ستكون النتيجة `1, 1, 2, 2`. وعند استخدام `WITH TIES`، تُدرَج ثلاثة صفوف إضافية بالقيمة `1` لأنها تتساوى مع أول صف مُحدَّد.

يمكن دمج هذا المُعدِّل مع المُعدِّل [`ORDER BY ... WITH FILL`](/ar/reference/statements/select/order-by#order-by-expr-with-fill-modifier).

## LIMIT ... AFTER ... UNTIL (‏نطاق حسب الشرط)

يمكنك حصر النتيجة في *نطاق* من الصفوف يقع بين شرطَي boundary:

```sql theme={null}
LIMIT [n] AFTER start_expr [UNTIL end_expr]
LIMIT [n] AFTER start_expr ALL [UNTIL end_expr]
LIMIT [n] UNTIL end_expr
```

* `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`:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 3 AFTER number >= 3;
```

```response theme={null}
┌─number─┐
│      3 │
│      4 │
│      5 │
└────────┘
```

الصفوف بدءًا من أول صف يكون فيه `number >= 2` وحتى (غير شامل) أول صف يكون فيه `number >= 6`:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 10 AFTER number >= 2 UNTIL number >= 6;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      4 │
│      5 │
└────────┘
```

بدون `n`، تُعاد جميع الصفوف بدءًا من تطابق `AFTER` وحتى نهاية الدفق (أو حتى `UNTIL`):

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number >= 7;
```

```response theme={null}
┌─number─┐
│      7 │
│      8 │
│      9 │
└────────┘
```

بدون `n` ولكن مع `UNTIL`، يمتد النطاق من أول تطابق لـ `AFTER` حتى أول تطابق لـ `UNTIL` يقع عنده أو بعده:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number >= 2 UNTIL number >= 6;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      4 │
│      5 │
└────────┘
```

يُتجاهل أي تطابق لـ `UNTIL` يسبق البداية؛ فهنا لا أثر لـ `number = 1`، وينتهي النطاق قبل `number = 6`:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number = 3 UNTIL number IN (1, 6);
```

```response theme={null}
┌─number─┐
│      3 │
│      4 │
│      5 │
└────────┘
```

إخراج صفّين بعد كل صف مطابق، دون تكرار التداخلات:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 AFTER number IN (2, 3, 6) ALL;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      4 │
│      6 │
│      7 │
└────────┘
```

مع `ALL` و`UNTIL`، ينتهي كل نطاق مفتوح عند بلوغه `n` من الصفوف أو عند أول تطابق تالٍ لـ `UNTIL`، أيهما أسبق؛ فهنا يُقطع النطاق المفتوح عند 6 بفعل `number = 7`:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 AFTER number IN (2, 6) ALL UNTIL number = 7;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      6 │
└────────┘
```

من دون `n`، يُغلق تطابق `UNTIL` النطاق الحالي، ويفتح تطابق `AFTER` لاحق نطاقًا جديدًا يمتد حتى النهاية إذا لم يتبعه تطابق `UNTIL` آخر:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT AFTER number IN (2, 6) ALL UNTIL number = 4;
```

```response theme={null}
┌─number─┐
│      2 │
│      3 │
│      6 │
│      7 │
│      8 │
│      9 │
└────────┘
```

من دون `n` و`UNTIL`، يمتد كل نطاق مفتوح حتى نهاية الدفق، لذا يعيد `AFTER start_expr ALL` الصفوف نفسها التي يعيدها `AFTER start_expr`.

<Note>
  * لا يمكن استخدام `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))`.
</Note>

يعيد `UNTIL` وحده الصفوف من بداية الدفق حتى أول صف يتحقق فيه الشرط:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT UNTIL number >= 3;
```

```response theme={null}
┌─number─┐
│      0 │
│      1 │
│      2 │
└────────┘
```

مع `n`، يُرجع `UNTIL` بمفرده `n` من الصفوف كحدٍّ أقصى بدءًا من بداية الدفق، مع التوقف عند أول تطابق:

```sql theme={null}
SELECT number FROM numbers(10) ORDER BY number LIMIT 2 UNTIL number >= 3;
```

```response theme={null}
┌─number─┐
│      0 │
│      1 │
└────────┘
```

يمكن أن يأتي النطاق بعد [`LIMIT BY`](/ar/reference/statements/select/limit-by)، وعندئذٍ ينطبق على الصفوف التي يُبقيها `LIMIT BY`:

```sql theme={null}
SELECT number % 4 AS k, number FROM numbers(12) ORDER BY k, number LIMIT 2 BY k LIMIT 3 AFTER k >= 1;
```

```response theme={null}
┌─k─┬─number─┐
│ 1 │      1 │
│ 1 │      5 │
│ 2 │      2 │
└───┴────────┘
```

## اعتبارات

**نتائج غير حتمية:** من دون عبارة [`ORDER BY`](/ar/reference/statements/select/order-by)، قد تكون الصفوف المُعادة عشوائية وقد تختلف من تنفيذ استعلام إلى آخر.

**حدّ على مستوى الخادم:** يمكن أيضًا أن يتأثر عدد الصفوف المُعادة بإعداد [limit](/ar/reference/settings/session-settings/other#limit).

## انظر أيضًا

* [LIMIT BY](/ar/reference/statements/select/limit-by) — يحدّ عدد الصفوف لكل مجموعة من القيم، وهو مفيد للحصول على أعلى N من النتائج ضمن كل فئة.
