Есть ли альтернатива ANSI SQL ключевому слову MYSQL LIMIT? - PullRequest
30 голосов
/ 27 февраля 2009

Существует ли альтернатива ANSI SQL ключевому слову MYSQL LIMIT?

Ключевое слово LIMIT ограничивает количество строк, возвращаемых SELECT, например:

SELECT * FROM People WHERE Age > 18 LIMIT 2;

возвращает 2 строки.

SELECT * FROM People WHERE Age > 18 LIMIT 10, 2;

возвращает 2 строки после первых 10.

Ответы [ 7 ]

36 голосов
/ 27 февраля 2009

это показывает разные пути:

-- DB2
select * from table fetch first 10 rows only 
-- Informix 
select first 10 * from table 
-- Microsoft SQL Server and Access 
select top 10 * from table 
-- MySQL and PostgreSQL 
select * from table limit 10 
-- Oracle 
select * from (select * from table) where rownum <= 10
22 голосов
/ 27 февраля 2009

Не в SQL: 1999.

Существует два возможных подхода, которые вы можете использовать в более поздних стандартах, с обычно низким уровнем поддержки в современных СУБД.

В SQL: 2008 вы можете использовать синтаксис DB / 2:

SELECT * FROM things
ORDER BY smell
FETCH FIRST n ROWS ONLY

Это работает только для «LIMIT n», но не для расширенного синтаксиса «LIMIT m, n». В SQL: 2003 вы можете использовать оконные функции, которые могут поддерживать расширенный синтаксис, но это супер PITA:

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY smell) AS rn,
    FROM things
)
WHERE rn<=n -- or rn BETWEEN m+1 AND m+n

Сегодня вы будете чаще использовать методы, специфичные для СУБД.

12 голосов
/ 23 сентября 2011

см. Также http://en.wikipedia.org/wiki/Select_(SQL)#FETCH_FIRST_clause

SELECT * FROM T LIMIT 10 OFFSET 20 -- Netezza, MySQL, PostgreSQL (also supports the standard, since version 8.4), SQLite, HSQLDB, H2

SELECT * from T WHERE ROWNUM <= 10 -- Oracle (also supports the standard, since Oracle8i)

SELECT FIRST 10 * from T -- Ingres

SELECT FIRST 10 * FROM T order by a -- Informix

SELECT SKIP 20 FIRST 10 * FROM T order by c, d -- Informix (row numbers are filtered after order by is evaluated. SKIP clause was introduced in a v10.00.xC4 fixpack)

SELECT TOP 10 * FROM T -- MS SQL Server, Sybase ASE, MS Access

SELECT TOP 10 START AT 20 * FROM T -- Sybase SQL Anywhere (also supports the standard, since version 9.0.1)

SELECT FIRST 10 SKIP 20 * FROM T -- Interbase, Firebird

SELECT * FROM T ROWS 20 TO 30 -- Firebird (since version 2.1)

SELECT * FROM T
WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY -- DB2

SELECT * FROM T
WHERE ID_T > 20 FETCH FIRST 10 ROWS ONLY -- DB2 (new rows are filtered after comparing with key column of table T)
3 голосов
/ 27 февраля 2009

Я не верю в это. Все базы данных, о которых я знаю, используют для этой функции ключевые слова, специфичные для поставщика.

1 голос
/ 10 марта 2010

HSQL / H2 использует LIMIT, как MySQL

1 голос
/ 27 февраля 2009

Добавление к @ jle's ответу :

  • SQLite поддерживает LIMIT (MySQL / PostgreSQL)
  • Поддержка InterBase / Firebird SELECT FIRST и SKIP (например, Informix)

Также см. Предложение эмуляции MySQL LIMIT в Microsoft SQL Server 2000

...