Requête Sqlite LIMIT / OFFSET

153

J'ai une question simple avec Sqlite. Quelle est la différence entre ceci:

Select * from Animals LIMIT 100 OFFSET 50

et

Select * from Animals LIMIT 100,50
Pablo
la source
9
Veuillez le marquer comme réponse si cela a dissipé vos doutes comme vous l'avez mentionné dans les commentaires.
Mubashar

Réponses:

270

Les deux formes de syntaxe sont un peu déroutantes car elles inversent les nombres:

LIMIT <skip>, <count>

Est équivalent à:

LIMIT <count> OFFSET <skip>

Il est compatible avec la syntaxe de MySQL et PostgreSQL. MySQL prend en charge les deux formes de syntaxe, et ses documents affirment que la seconde syntaxe avec OFFSET était destinée à assurer la compatibilité avec PostgreSQL. Les documents PostgreSQL montrent qu'il ne prend en charge que la deuxième syntaxe, et les documents de SQLite montrent qu'il prend en charge les deux, recommandant la deuxième syntaxe pour éviter toute confusion.

Soit dit en passant, utiliser LIMIT sans utiliser ORDER BY au préalable ne vous donnera pas toujours les résultats souhaités. En pratique, SQLite retournera les lignes dans un certain ordre, probablement déterminé par la manière dont elles sont physiquement stockées dans le fichier. Mais cela ne signifie pas nécessairement que c'est dans l'ordre que vous souhaitez. La seule façon d'obtenir un ordre prévisible est d'utiliser ORDER BY explicitement.

Bill Karwin
la source
2
LIMIT <count> OFFSET <skip>est plus clair. Je vous remercie.
Guido Mocha
Cette réponse similaire a une bonne solution avec de bonnes performances si l'ordre des lignes compte. stackoverflow.com/a/28860492/5016333
Rodrigo V
23

Ce dernier est une syntaxe alternative avec une mise en garde :

Si une virgule est utilisée à la place du mot clé OFFSET, alors le décalage est le premier nombre et la limite est le deuxième nombre. Cette contradiction apparente est intentionnelle - elle maximise la compatibilité avec les systèmes de base de données SQL hérités.

Nick Dandoulakis
la source
5

J'ai fait quelques tests et il n'y a pas de différence de performances.

C'est uniquement pour la compatibilité avec d'autres langages SQL.

La durée de fonctionnement des deux versions est la même.

J'ai créé sqlite db avec table1 avec 100000 lignes. Je lance le prochain test

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) + "");
}

Les temps varient pendant 0,001 seconde

Kalanj Djordje Djordje
la source
1
pourquoi y aurait-il une différence de performance? ils sont pareils!
Abhinav Gauniyal