joins - ¿Existe una alternativa ANSI SQL a la palabra clave MYSQL LIMIT?
mysql union group by (7)
Agregando a la answer @ jle:
- SQLite admite
LIMIT
(MySQL / PostgreSQL) - InterBase / Firebird admite
SELECT FIRST
ySKIP
(como Informix)
También vea la cláusula Emulate MySQL LIMIT en Microsoft SQL Server 2000
¿Existe una alternativa ANSI SQL a la palabra clave MYSQL LIMIT?
La palabra clave LIMIT limita el número de filas devueltas por un SELECT, por ejemplo:
SELECT * FROM People WHERE Age > 18 LIMIT 2;
devuelve 2 filas.
SELECT * FROM People WHERE Age > 18 LIMIT 10, 2;
devuelve 2 filas después de los primeros 10.
HSQL / H2 usa LIMIT como MySQL
No en SQL: 1999.
Hay dos enfoques posibles que puede usar en estándares posteriores, con niveles generalmente bajos de soporte en los DBMS actuales.
En SQL: 2008 puede usar la sintaxis DB / 2:
SELECT * FROM things
ORDER BY smell
FETCH FIRST n ROWS ONLY
Esto solo funciona para "LIMIT n" y no para la sintaxis de compensación "LIMIT m, n" extendida. En SQL: 2003 puede usar funciones de ventana, que pueden soportar la sintaxis extendida pero es un super 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
Por lo general, utilizará los métodos específicos de DBMS hoy.
Permítanme unir aquí una pregunta relacionada con SO, con una gran respuesta de Lukas Eder y otra buena respuesta de bobince :
¿Qué tan universal es la instrucción LIMIT en SQL?
editar: unos pocos enlaces de referencia más buenos, vale la pena mirar en casos similares:
Yo no lo creo. Todas las bases de datos de las que tengo conocimiento utilizan palabras clave específicas del proveedor para esa funcionalidad.
ver también 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)
esto muestra las diferentes maneras:
-- 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