7.6. LIMIT
и OFFSET
#
Указания LIMIT
и OFFSET
позволяют получить только часть строк из тех, что выдал остальной запрос:
SELECTсписок_выборки
FROMтабличное_выражение
[ ORDER BY ... ] [ LIMIT {число
| ALL } ] [ OFFSETчисло
]
Если указывается число LIMIT, в результате возвращается не больше заданного числа строк (меньше может быть, если сам запрос выдал меньшее количество строк). LIMIT ALL
равносильно отсутствию указания LIMIT
, как и LIMIT
с аргументом NULL.
OFFSET
указывает пропустить указанное число строк, прежде чем начать выдавать строки. OFFSET 0
равносильно отсутствию указания OFFSET
, как и OFFSET
с аргументом NULL.
Если указано и OFFSET
, и LIMIT
, сначала система пропускает OFFSET
строк, а затем начинает подсчитывать строки для ограничения LIMIT
.
Применяя LIMIT
, важно использовать также предложение ORDER BY
, чтобы строки результата выдавались в определённом порядке. Иначе будут возвращаться непредсказуемые подмножества строк. Вы можете запросить строки с десятой по двадцатую, но какой порядок вы имеете в виду? Порядок будет неизвестен, если не добавить ORDER BY
.
Оптимизатор запроса учитывает ограничение LIMIT
, строя планы выполнения запросов, поэтому вероятнее всего планы (а значит и порядок строк) будут меняться при разных LIMIT
и OFFSET
. Таким образом, различные значения LIMIT
/OFFSET
, выбирающие разные подмножества результатов запроса, приведут к несогласованности результатов, если не установить предсказуемую сортировку с помощью ORDER BY
. Это не ошибка, а неизбежное следствие того, что SQL не гарантирует вывод результатов запроса в некотором порядке, если порядок не определён явно предложением ORDER BY
.
Строки, пропускаемые согласно предложению OFFSET
, тем не менее должны вычисляться на сервере. Таким образом, при больших значениях OFFSET
работает неэффективно.