MySQL LIMIT & OFFSET mit Beispielen
โก Intelligente Zusammenfassung
Das MySQL Das Schlรผsselwort LIMIT begrenzt die Anzahl der von einer Abfrage zurรผckgegebenen Zeilen, und der Wert OFFSET bestimmt die Startzeile des Ergebnisses. Zusammen sorgen sie fรผr kleine Ergebnismengen, kurze Ladezeiten und eine datensatzweise Paginierung.

Was ist das LIMIT-Schlรผsselwort in MySQL?
Das LIMIT Das Schlรผsselwort beschrรคnkt die Anzahl der in einem Abfrageergebnis zurรผckgegebenen Zeilen. Es kann mit den Anweisungen SELECT, UPDATE und DELETE verwendet werden und begrenzt somit sowohl die von einer Abfrage gelesenen als auch die von einer Schreiboperation betroffenen Zeilen.
Die Syntax fรผr das Schlรผsselwort LIMIT lautet wie folgt.
SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;
HIER KLICKEN
- โSELECT {fieldname(s) | *} FROM Tabellenname(n)โ ist das SELECT-Anweisung enthรคlt die Felder, die wir in unserer Abfrage zurรผckgeben mรถchten.
- โ[WHERE-Bedingung]โ ist optional, aber wenn es angegeben wird, legt es einen Filter fรผr das Ergebnis-Set fest. WHERE-Klausel wird vor LIMIT angewendet, daher findet die Filterung zuerst statt und die Begrenzung wird auf das angewendet, was รผbrig bleibt.
- โLIMIT Nโ ist das Schlรผsselwort, und N Jede Zahl ab 0 ist zulรคssig. Die Angabe von 0 als Grenzwert liefert keine Ergebnisse. Eine Zahl wie 5 liefert fรผnf Datensรคtze. Enthรคlt die Tabelle weniger als N Datensรคtze, werden alle zurรผckgegeben, und es wird kein Fehler ausgelรถst.
Die Syntax ist kurz, aber der Grund fรผr ihre Existenz sollte vor den Beispielen erlรคutert werden.
Warum sollten wir das Schlรผsselwort LIMIT verwenden?
Angenommen, wir entwickelnping Die Anwendung lรคuft auf MyFlixDB. Die Systementwickler haben uns gebeten, die Anzahl der angezeigten Datensรคtze pro Seite auf 20 zu begrenzen, um lange Ladezeiten zu vermeiden. Wie implementieren wir ein System, das diese Anforderung erfรผllt?
Das LIMIT-Schlรผsselwort behandelt genau diese Situation. Anstatt alle Datensรคtze in die Anwendung zu laden und die meisten davon zu verwerfen, gibt die Abfrage 20 Datensรคtze pro Seite zurรผck, und die Datenbank erledigt die Arbeit. Daraus ergeben sich drei Vorteile.
- Schnellere Reaktion: Es werden weniger Daten von der Festplatte gelesen und weniger Daten werden รผber das Netzwerk รผbertragen.
- Geringerer Speicherverbrauch: Die Anwendung enthรคlt nur eine Seite mit Zeilen, nicht die gesamte Tabelle.
- Safer schreibt: eine Begrenzung fรผr ein Update oder ein LรSCHEN Diese Anweisung begrenzt, wie viele Zeilen ein Fehler betreffen kann.
MySQL LIMIT-Abfragebeispiele
Die folgenden Beispiele werden auf die Tabelle โmembersโ der Datenbank โmyflixdbโ angewendet. Das erste Beispiel gibt zwei Zeilen zurรผck, und sonst nichts.
SELECT * FROM members LIMIT 2;
| Mitgliedsnummer | ganze Namen | Geschlecht | Geburtsdatum | Datum der Registrierung | physikalische Adresse | Anschrift | Kontaktnummer | Kreditkartennummer | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Weiblich | 21-07-1980 | NULL | Erstes Straรengrundstรผck Nr. 4 | Private Tasche | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Weiblich | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
Wie das obige Ergebnis zeigt, wurden nur zwei Mitglieder zurรผckgebracht.
Abrufen einer Liste von zehn (10) Mitgliedern aus der Datenbank
Angenommen, wir mรถchten eine Liste der ersten 10 registrierten Mitglieder aus der Myflix-Datenbank. Das folgende Skript fragt diese ab.
SELECT * FROM members LIMIT 10;
Die Ausfรผhrung des Skripts fรผhrt zu dem unten dargestellten Ergebnis.
| Mitgliedsnummer | ganze Namen | Geschlecht | Geburtsdatum | Datum der Registrierung | physikalische Adresse | Anschrift | Kontaktnummer | Kreditkartennummer | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Weiblich | 21-07-1980 | NULL | Erstes Straรengrundstรผck Nr. 4 | Private Tasche | 0759 253 542 | janetjones@yagoo.cm | NULL |
| 2 | Janet Smith Jones | Weiblich | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Mรคnnlich | 12-07-1989 | NULL | 3. Straรe 34 | NULL | 12345 | rm@tstreet.com | NULL |
| 4 | Gloria Williams | Weiblich | 14-02-1984 | NULL | 2. Straรe 23 | NULL | NULL | NULL | NULL |
| 5 | Leonhard Hofstรคdter | Mรคnnlich | NULL | NULL | Waldkrone | NULL | 845738767 | NULL | NULL |
| 6 | Sheldon Cooper | Mรคnnlich | NULL | NULL | Waldkrone | NULL | 976736763 | NULL | NULL |
| 7 | Rajesh Koothrappali | Mรคnnlich | NULL | NULL | Waldkrone | NULL | 938867763 | NULL | NULL |
| 8 | Leslie Winkel | Mรคnnlich | 14-02-1984 | NULL | Waldkrone | NULL | 987636553 | NULL | NULL |
| 9 | Howard Wolowitz | Mรคnnlich | 24-08-1981 | NULL | Sรผd Park | P.O. Box 14473 | 987786553 | lwolowitz[at]email.me | NULL |
Es wurden nur 9 Eintrรคge zurรผckgegeben, da N in der LIMIT-Klausel grรถรer ist als die Anzahl der Datensรคtze in der Tabelle. Die explizite Abfrage von 9 Zeilen liefert dasselbe Ergebnis.
SELECT * FROM members LIMIT 9;
๐ก Tipp: LIMIT wรคhlt Zeilen in der vom Server zufรคlligen Reihenfolge aus. Fรผge ein SORTIEREN NACH Klausel immer dann, wenn die Identitรคt der Reihen von Bedeutung ist, andernfalls ist nicht garantiert, dass โdie ersten 10 Mitgliederโ zweimal dieselben neun Personen bedeuten.
Die Begrenzung der Zeilenanzahl ist die erste Hรคlfte der Funktion. Die Auswahl des Startpunkts des Fensters ist die zweite.
Verwendung des OFFSET-Werts in der LIMIT-Abfrage
Das OFFSET Der Wert wird meist zusammen mit dem Schlรผsselwort LIMIT verwendet. Er gibt an, ab welcher Zeile der Server Daten abruft, sodass Zeilen vor dieser Zeile รผbersprungen werden.
Angenommen, wir mรถchten eine begrenzte Anzahl von Elementen ab der Mitte der Tabelle auswรคhlen. Das folgende Skript beginnt in der zweiten Zeile und beschrรคnkt das Ergebnis auf zwei Datensรคtze.
SELECT * FROM `members` LIMIT 1, 2;
Die Ausfรผhrung in MySQL Werkbank Der Vergleich mit myflixdb liefert folgendes Ergebnis.
| Mitgliedsnummer | ganze Namen | Geschlecht | Geburtsdatum | Datum der Registrierung | physikalische Adresse | Anschrift | Kontaktnummer | Kreditkartennummer | |
|---|---|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | Weiblich | 23-06-1980 | NULL | Melrose 123 | NULL | NULL | jj@fstreet.com | NULL |
| 3 | Robert Phil | Mรคnnlich | 12-07-1989 | NULL | 3. Straรe 34 | NULL | 12345 | rm@tstreet.com | NULL |
Beachten Sie, dass hier VERSATZ = 1Daher ist Zeile 2 die erste zurรผckgegebene Zeile, und LIMIT = 2Daher werden nur 2 Datensรคtze zurรผckgegeben.
Bei der Zwei-Argument-Form wird zuerst der Offset und dann die Zeilenanzahl angegeben, was leicht versehentlich vertauscht werden kann. MySQL Akzeptiert auch eine explizite Form, die die Mehrdeutigkeit beseitigt, und diese sollte in neuem Code bevorzugt werden.
SELECT * FROM `members` LIMIT 2 OFFSET 1;
Beide Anweisungen liefern dieselben zwei Zeilen. Da der Offset bekannt ist, ergibt sich das Paginierungsmuster, auf dem jede Listenansicht basiert, direkt daraus.
Wie man Abfrageergebnisse mit LIMIT und OFFSET paginiert
Die Paginierung unterteilt groรe Ergebnismengen in nummerierte Seiten. Die Kombination aus LIMIT und OFFSET ist der Mechanismus, der dies bewirkt. Zwei Werte bestimmen jede Seitenanforderung: die Seitengrรถรe, also die Anzahl der Datensรคtze pro Bildschirm, und die vom Benutzer angeforderte Seitenzahl.
Der Offset wird daraus mit einer einzigen Formel abgeleitet.
-- OFFSET = page_size * (page_number - 1) SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 0; -- page 1
Seite 2 behรคlt die gleiche Begrenzung bei und verschiebt den Versatz um eine Seitengrรถรe nach vorne.
SELECT membership_number, full_names FROM members ORDER BY membership_number ASC LIMIT 20 OFFSET 20; -- page 2
Drei Regeln sorgen dafรผr, dass eine paginierte Auflistung korrekt und schnell ist.
- Immer sortieren: Eine paginierte Abfrage ohne ORDER BY kann denselben Datensatz auf zwei verschiedenen Seiten anzeigen und einen anderen vollstรคndig ausblenden, da der Server die Reihenfolge der Zeilen zwischen den Aufrufen รคndern kann.
- Nach einer eindeutigen Spalte sortieren: Bei Gleichstรคnden in der Sortierspalte ist die Reihenfolge der betroffenen Zeilen undefiniert. Durch Sortieren nach dem Primรคrschlรผssel oder dessen Verwendung als Kriterium bei Gleichstรคnden lรคsst sich dieses Problem beheben.
- Schauen Sie sich die Tiefenseiten an: OFFSET 100000 Krรคfte MySQL Hunderttausend Zeilen zu lesen und zu verwerfen, bevor die nรคchsten zwanzig zurรผckgegeben werden. Die Antwortzeit steigt mit der Seitenzahl.
Bei sehr tiefer Paginierung umgeht die Schlรผsselsatz-Paginierung den Offset vollstรคndig. Anstatt die zu รผberspringenden Zeilen zu zรคhlen, merkt sich die Abfrage den letzten Schlรผssel der vorherigen Seite und fragt die darauf folgenden Zeilen ab.
SELECT membership_number, full_names FROM members WHERE membership_number > 20 -- last id from the previous page ORDER BY membership_number ASC LIMIT 20;
Diese Form bleibt in jeder Tiefe schnell, da der Index direkt zum Startschlรผssel springt, anstatt die Zeilen davor zu durchlaufen. Der Nachteil ist, dass die Seiten der Reihe nach durchlaufen werden mรผssen.ping Ein direkter Aufruf von Seite 500 ist nicht mehr mรถglich.
LIMIT in MySQL vs TOP und FETCH FIRST
LIMIT ist nicht Bestandteil jedes SQL-Dialekts, was sich als wichtig erweist, sobald eine Abfrage zwischen verschiedenen Datenbank-Engines รผbertragen werden muss. MySQL, PostgreSQL und SQLite Das LIMIT-Schlรผsselwort wird geteilt. SQL Server verwendet TOP, und Oracle verwendet die Standard-FETCH-FIRST-Klausel. Die folgende Tabelle vergleicht die drei Varianten.
| Klausel | Motor | Beispiel | รberspringt Zeilen |
|---|---|---|---|
| LIMIT โฆ OFFSET | MySQL, PostgreSQL, SQLite | SELECT * FROM members LIMIT 20 OFFSET 40; | Ja, mit OFFSET |
| TOP | SQL Server | WรHLE DIE TOP 20 * AUS DER AUSWAHL der Mitglieder; | Nein, OFFSET โฆ FETCH ist erforderlich. |
| Zuerst abholen | Oracle, Db2, Standard-SQL | SELECT * FROM members FETCH FIRST 20 ROWS ONLY; | Ja, mit OFFSET โฆ ROWS |
Das Verhalten ist in jedem Fall gleich: Die Anzahl der Zeilen wird begrenzt und optional kรถnnen zunรคchst einige Zeilen รผbersprungen werden. Lediglich die Schreibweise รคndert sich. Eine Abfrage, die auf mehreren Engines ausgefรผhrt werden soll, sollte daher die Zeilenbegrenzungsklausel isolieren, anstatt sie im gesamten Code zu verteilen.
