Существует ли альтернатива 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.
Ответы
Ответ 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
Я так не верю. Все базы данных, о которых я знаю, используют ключевые слова для конкретных поставщиков для этой функции.
Ответ 5
Добавление к @jle answer:
- SQLite поддерживает
LIMIT
(MySQL/PostgreSQL)
- Поддержка InterBase/Firebird
SELECT FIRST
и SKIP
(например, Informix)
Также см. Эмуляция предложения MySQL LIMIT в Microsoft SQL Server 2000
Ответ 6
HSQL/H2 использует LIMIT, например MySQL
Ответ 7
Позвольте мне связать здесь связанный с этим вопрос SO, с отличным ответом Лукаса Эдера и другим хорошим ответом от bobince:
Насколько универсален оператор LIMIT в SQL?
edit: Еще несколько хороших ссылок, которые стоит посмотреть в подобных случаях: