Подтвердить что ты не робот

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

Есть ли альтернатива ANSI SQL для ключевого слова LIMIT MYSQL?

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

SELECT * FROM People WHERE Age > 18 LIMIT 2;

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

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

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

4b9b3361

Ответ 1

показывает разные способы:

-- 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

Ответ 2

Не в 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

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

Ответ 3

см. также 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)

Ответ 4

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

Ответ 6

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

Ответ 7

Позвольте мне связать здесь связанный с этим вопрос SO, с отличным ответом Лукаса Эдера и другим хорошим ответом от bobince:

Насколько универсален оператор LIMIT в SQL?

edit: Еще несколько хороших ссылок, которые стоит посмотреть в подобных случаях: