LIMIT задаёт количество строк, возвращаемых в результатах запроса. Строки можно выбирать по количеству и смещению либо по условиям, которые открывают и закрывают диапазон строк, с помощью LIMIT ... AFTER ... UNTIL.
Основной синтаксис
Выбор первых строк:m строк результата или все записи, если их меньше m.
Альтернативный синтаксис TOP (совместимый с MS SQL Server):
LIMIT m и может использоваться для совместимости с запросами Microsoft SQL Server.
Выборка с OFFSET:
n строк, затем возвращает следующие m строк.
В обеих формах n и m должны быть неотрицательными целыми числами.
Выбор диапазона по условиям:
start_expr истинно, или с начала потока, если AFTER опущен, и до первой строки, находящейся в этой начальной позиции или после неё, где end_expr истинно, не включая её; n ограничивает длину этого диапазона. AFTER start_expr ALL открывает диапазон на каждой подходящей строке. См. LIMIT … AFTER … UNTIL ниже.
Отрицательные ограничения
Выбирайте строки из конца результирующего набора, используя отрицательные значения:
Синтаксис
LIMIT -n, -m эквивалентен LIMIT -m OFFSET -n.
Дробные лимиты
Используйте десятичные значения от 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 (диапазон по условиям)
Результат можно ограничить диапазоном строк между двумя граничными условиями: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 результатов в каждой категории.