7.6. LIMIT и OFFSET#

7.6. LIMIT и OFFSET

7.6. LIMIT и OFFSET

LIMIT и OFFSET позволяют вам извлекать только часть строк, которые генерируются остальным запросом:

SELECT select_list
    FROM table_expression
    [ ORDER BY ... ]
    [ LIMIT { number | ALL } ] [ OFFSET number ]

Если указано ограничение на количество строк, будет возвращено не более указанного количества строк (но возможно меньше, если сам запрос возвращает меньше строк). 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 может быть неэффективным.