FirebirdSQL logo

Примеры

Ниже приведены примеры, ранее использованные для демонстрации FIRST/SKIP.

Следующий запрос вернёт первые 10 имён из таблицы PEOPLE (имена также будут отсортированы, см. ORDER BY).

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 1 TO 10

или его эквивалент

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 10

Следующий запрос вернёт все записи из таблицы PEOPLE, за исключением первых 10 имён:

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 11 TO (SELECT COUNT(*) FROM People)

А этот запрос вернёт последние 10 записей (обратите внимание на скобки):

SELECT id, name
FROM People
ORDER BY name ASC
ROWS (SELECT COUNT(*) - 9 FROM People)
TO (SELECT COUNT(*) FROM People)

Этот запрос вернёт строки 81-100 из таблицы PEOPLE:

SELECT id, name
FROM People
ORDER BY name ASC
ROWS 81 TO 100
См. также:

"FETCH, OFFSET", "FIRST, SKIP".

FETCH, OFFSET

Предложения FETCH и OFFSET являются SQL:2008 совместимым эквивалентом предложениям FIRST/SKIP и альтернативой предложению ROWS.Предложение OFFSET указывает, какое количество строк необходимо пропустить.Предложение FETCH указывает, какое количество строк необходимо получить.

Предложения OFFSET и FETCH могут применяться независимо уровня вложенности выражений запросов.

Синтаксис
SELECT <columns> FROM ...
  [WHERE ...]
  [ORDER BY ...]
  [OFFSET <offset-fetch-expression> {ROW | ROWS}]
  [FETCH {FIRST | NEXT} [ <offset-fetch-expression> ] { ROW | ROWS } ONLY]

<offset-fetch-expression>  ::=
    <integer-literal>
  | <query-parameter>
Table 1. Параметры предложений OFFSET и FETCH
Параметр Описание

integer-literal

Целочисленный литерал

query-parameter

Парамер запрос.? в DSQL и :paramname в PSQL

Note
  • Firebird не поддерживает указание FETCH в процентах, определённое в стандарте.

  • Firebird не поддерживает предложение FETCH с опцией WITH TIES, которая определена в стандарте.

  • FIRST …​ SKIP и ROWS являются нестандартными альтернативами.

  • Предложения OFFSET и/или FETCH не могут быть объединены с предложениями ROWS или FIRST/SKIP в одном выражении запроса.

  • Выражения, ссылки на столбцы и т.д. недопустимы в любом из предложений.

  • В отличие от предложения ROWS, предложения OFFSET и FETCH допустимы только в операторе SELECT.

Примеры использования OFFSET и FETCH

Следующий запрос возвращает все строки кроме первых 10, упорядоченных по столбцу COL1:

SELECT *
FROM T1
ORDER BY COL1
OFFSET 10 ROWS

В этом примере возвращается первые 10 строк, упорядоченных по столбцу COL1:

SELECT *
FROM T1
ORDER BY COL1
FETCH FIRST 10 ROWS ONLY

Использование предложений OFFSET и FETCH в производной таблице, результат которой ограничивается ещё раз во внешнем запросе.

SELECT *
FROM (
  SELECT *
  FROM T1
  ORDER BY COL1 DESC
  OFFSET 1 ROW
  FETCH NEXT 10 ROWS ONLY
) a
ORDER BY a.COL1
FETCH FIRST ROW ONLY
См. также:

ROWS, "FIRST, SKIP".

FOR UPDATE [OF]

Синтаксис
SELECT ...
  FROM single_table
  [WHERE ...]
  [FOR UPDATE [OF <column-names>]]

Предложение FOR UPDATE не делает то, что от него ожидается.В настоящее время единственный эффект от его использования заключается лишь в отключении упреждающей выборки в буфер.

Tip

Это, вероятно, изменится в будущем: план состоит в том, чтобы проверять курсоры, отмеченные как FOR UPDATE, действительно ли они обновляемые, и отклонять позиционированные обновления и удаления для курсоров, оцененных как не обновляемый.

Предложение OF не делает ничего вообще.