tablas joins example mysql database keyword ansi-sql

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 y SKIP (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