Реализация аналога MySQL 'LIMIT' в SQL Server: примеры

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Лимитировать число строк в возвращаемом запросом результате можно с использованием TOP:

SQL
Скопировать код
SELECT TOP (10) * FROM YourTable;

Реализация пагинации или пропуска заданного числа строк возможна с применением OFFSET ... FETCH при условии использования ORDER BY:

SQL
Скопировать код
SELECT * FROM YourTable 
ORDER BY YourColumn 
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

Сложные сценарии будут разобраны в следующих разделах.

Работа с различными версиями сервера

ROW_NUMBER() в SQL Server до 2012 года

В версиях SQL Server до 2012 года функция ROW_NUMBER() считалась наиболее подходящей для ограничения количества строк. Её применение со сведениями об общем Табличном Выражении или подзапросами позволяло эффективно выбирать данные с нужными лимитами.

SQL
Скопировать код
WITH NumberedMyTable AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY YourColumn) AS RowNum
  FROM YourTable
)
SELECT * FROM NumberedMyTable WHERE RowNum BETWEEN 11 AND 20;

OFFSET FETCH в SQL Server начиная с 2012 года

С выходом SQL Server 2012 появилась директива OFFSET FETCH, которая облегчает написание сложных SQL-запросов, сохраняя при этом простоту понимания.

SQL
Скопировать код
SELECT * FROM YourTable
ORDER BY YourColumn
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

Обратите внимание: OFFSET FETCH используется исключительно в сочетании с ORDER BY.

Оптимизация производительности

Повышение скорости с помощью индексов

Оптимизированные под ORDER BY индексы могут значительно ускорить обработку запросов с ROW_NUMBER() или OFFSET FETCH.

Стройность увеличивает скорость

Указывайте конкретные столбцы вместо применения SELECT *. Таким образом, вы уменьшите количество передаваемых данных и повысите производительность запроса.

Неповторимость порядка

Неопределённый ORDER BY может привести к непредсказуемым результатам при организации страниц пагинации. Мы пишем код, а не занимаемся азартными играми – применяйте для ORDER BY уникальные поля или их сочетания.

Запрос конкретных диапазонов строк

Выбор диапазонов строк с использованием ROW_NUMBER()

Дабы выбрать строки из определённого диапазона, используйте ROW_NUMBER() в сочетании с BETWEEN.

SQL
Скопировать код
WITH NumberedMyTable AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY YourColumn) AS RowNum
  FROM YourTable
)
SELECT * FROM NumberedMyTable WHERE RowNum BETWEEN 101 AND 110;

OFFSET FETCH для определения диапазонов

В SQL Server, начиная с версии 2012, OFFSET FETCH позволяет легко выбрать строки по определённым диапазонам.

SQL
Скопировать код
SELECT * FROM YourTable
ORDER BY YourColumn
OFFSET 100 ROWS FETCH NEXT 10 ROWS ONLY;

Использование CTE для сложных запросов

Для упорядочения и улучшения читаемости сложных запросов воспользуйтесь CTE.

SQL
Скопировать код
WITH CTE AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY YourColumn) AS RowNum
  FROM YourTable WHERE YourColumn > 100
)
SELECT * FROM CTE WHERE RowNum BETWEEN 21 AND 30;

Применение CTE позволяет упорядочить подзапросы, обеспечивая таким образом высокую производительность и простоту поддержки.

Визуализация

Функция LIMIT в SQL Server действует в качестве фильтра, подобного контролеру качества на производственной линии:

Markdown
Скопировать код
План производства (🏭) = Полный набор данных

Рабочий на линии (👷‍♂️) = Процессор

Готовый товар (📦) = Результат запроса
SQL
Скопировать код
SELECT TOP (5) ProductName FROM Products ORDER BY Price;
-- Только 5 лучших 📦 проходят контроль!

Эта аналогия поможет вам лучше понять, как функционирует «LIMIT».

Миграция с других диалектов SQL

Переходите на SQL Server с MySQL? Вот как адаптировать LIMIT из MySQL к OFFSET FETCH в SQL Server:

В MySQL используется LIMIT:

SQL
Скопировать код
SELECT * FROM YourTable LIMIT 10, 20;

В SQL Server применяется OFFSET FETCH:

SQL
Скопировать код
SELECT * FROM YourTable
ORDER BY YourColumn
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

Владение несколькими диалектами SQL делает вашу работу ещё более лёгкой и эффективной!

Полезные материалы

  1. ORDER BY Clause (Transact-SQL) – SQL Server | Microsoft Learn — Официальная документация Microsoft на тему OFFSET FETCH.
  2. SQL Server: SELECT TOP Statement — Инструкция по работе с SELECT TOP.
  3. Реализация 'LIMIT' в SQL Server — Обсуждение вопроса на форуме Stack Overflow.
  4. Симулирование 'LIMIT' в SQL Server — Советы по реализации функционала LIMIT в SQL Server.
  5. Подводные камни OFFSET FETCH — Важная информация перед использованием OFFSET FETCH.