Consulta LIMIT / OFFSET de SQLite

153

Tengo una pregunta simple con Sqlite. ¿Cuál es la diferencia entre esto?

Select * from Animals LIMIT 100 OFFSET 50

y

Select * from Animals LIMIT 100,50
Pablo
fuente
9
Marque como respuesta si ha despejado sus dudas como mencionó en los comentarios.
Mubashar

Respuestas:

270

Las dos formas de sintaxis son un poco confusas porque invierten los números:

LIMIT <skip>, <count>

Es equivalente a:

LIMIT <count> OFFSET <skip>

Es compatible con la sintaxis de MySQL y PostgreSQL. MySQL admite ambas formas de sintaxis, y sus documentos afirman que la segunda sintaxis con OFFSET estaba destinada a proporcionar compatibilidad con PostgreSQL. Los documentos de PostgreSQL muestran que solo admite la segunda sintaxis, y los documentos de SQLite muestran que admite ambos, recomendando la segunda sintaxis para evitar confusiones.

Por cierto, usar LIMIT sin usar ORDER BY no siempre puede darte los resultados que deseas. En la práctica, SQLite devolverá las filas en algún orden, probablemente determinado por cómo se almacenan físicamente en el archivo. Pero esto no significa necesariamente que esté en el orden que desea. La única forma de obtener un orden predecible es usar ORDER BY explícitamente.

Bill Karwin
fuente
2
LIMIT <count> OFFSET <skip>Es más claro. Gracias.
Guido Mocha
Esta respuesta similar tiene una buena solución con buen rendimiento si el orden de las filas es importante. stackoverflow.com/a/28860492/5016333
Rodrigo V
23

La última es una sintaxis alternativa con una advertencia :

Si se usa una coma en lugar de la palabra clave OFFSET, el desplazamiento es el primer número y el límite es el segundo número. Esta aparente contradicción es intencional: maximiza la compatibilidad con los sistemas de bases de datos SQL heredados.

Nick Dandoulakis
fuente
5

Hice algunas pruebas y no hay diferencia en el rendimiento.

Eso es solo para compatibilidad con otros lenguajes sql.

El tiempo de ejecución de ambas versiones es el mismo.

Hice sqlite db con table1 con 100000 filas. Corro la próxima prueba

long timeLimitOffset = 0;
long timeLimitComma = 0;
for (int i = 0; i < 100000; i++)
{
   //first version
   timeLimitOffset += SqlDuraction("Select * from table1  order by col1 LIMIT " + (i + 1) + " OFFSET " + (1001 - i) + "");
   // second version
   timeLimitComma += SqlDuraction("Select * from table1 order by col1 LIMIT " + (1001 - i) + " , " + (i + 1) + "");
}

Los tiempos varían por 0.001 de segundo

Kalanj Djordje Djordje
fuente
1
¿Por qué habría alguna diferencia en el rendimiento? ¡Son lo mismo!
Abhinav Gauniyal