LIMIT and OFFSET

7.6. LIMIT and OFFSET

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

SELECT список_выбора
    FROM табличное_выражение
    [ ORDER BY ... ]
    [ LIMIT { номер | ALL } ] [ OFFSET номер ]

Если задано количество для LIMIT, то будет выдано не более, чем указанное количество строк (но возможно меньшее, если сам запрос возвращает меньше строк). Указание LIMIT ALL аналогично отсутствию предложения LIMIT.

OFFSET говорит пропустить определённое количество строк перед началом вывода. OFFSET 0 аналогично отсутствию предложения OFFSET, LIMIT NULL это тоже самое, что и отсутствие предложения LIMIT. В случае указания как OFFSET так и LIMIT, перед выводом указанного в LIMIT количества строк, пропускается указанное в OFFSET количество строк.

При использовании LIMIT, важно использовать предложение ORDER BY, которое обеспечивает вывод строк в определённом порядке. В противном случае вы получите при выполнении запроса непредстказуемый набор строк. Вы можете спросить, а что будет если вы захотите получить десять строк, после пропуска двадцати? Если вы не указали ORDER BY, то какие это будут строки неизвестно.

Оптимизатор запроса при построении плана запроса берёт LIMIT в рассчёт, так что вы будете получать различные планы запросов (неустойчивые разные порядки следования строк) в зависимости от того какие значения вы укажете для LIMIT и OFFSET. Таким образом, использование различных значений в LIMIT/OFFSET для выбора различных подсписков из результата запроса приведёт к получению противоречивых результатов, если только для получения предсказумых результатов, вы не используете сортировку с ORDER BY. Такое поведение не является ошибочным; оно является закономерным следствием того факта, что SQL не обещает получения результатов запроса в одном и том же порядке, если для упорядочивания не осуществляется явно с помощью ORDER BY.

Строки, пропущенные предложением OFFSET должны подсчитываться внутри СУБД; таким образом большие значения OFFSET могут работать неэффективно.

Back to top

(С) Виктор Вислобоков, 2008-2023