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
и , то строки пропускаются до начала подсчета возвращаемых строк.LIMITOFFSETLIMIT
При использовании LIMIT
важно использовать ORDER BY
предложение, которое ограничивает строки результатов уникальным порядком. В противном случае вы получите непредсказуемое подмножество строк запроса. Вы можете просить ряды с десятого по двадцатый, но в каком порядке с десятого по двадцатый? Порядок неизвестен, если вы не указали ORDER BY
.
Оптимизатор запросов LIMIT
учитывает это при создании планов запросов, поэтому вы, скорее всего, получите разные планы (с разным порядком строк) в зависимости от того, что вы даете для LIMIT
и OFFSET
. Таким образом, использование разных значений LIMIT
/ OFFSET
для выбора разных подмножеств результата запроса приведет к противоречивым результатам , если только вы не настроите предсказуемый порядок результатов с помощью ORDER BY
. Это не ошибка; это неотъемлемое следствие того факта, что SQL не обещает выдавать результаты запроса в каком-либо конкретном порядке, если только ORDER BY
он не используется для ограничения порядка.
Строки, пропущенные OFFSET
предложением, все равно должны быть вычислены внутри сервера; поэтому большой OFFSET
может быть неэффективным.
0 комментариев