7.6. LIMIT и OFFSET#
7.6. LIMIT
и OFFSET
#
LIMIT
и OFFSET
позволяют вам извлекать только
часть строк, которые генерируются остальным запросом:
SELECTselect_list
FROMtable_expression
[ ORDER BY ... ] [ LIMIT {number
| ALL } ] [ OFFSETnumber
]
Если указано ограничение на количество строк, будет возвращено не более указанного количества строк (но возможно меньше, если сам запрос возвращает меньше строк). 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
может быть неэффективным.