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.

  • ๐Ÿ”ข Kernverhalten: LIMIT N gibt maximal N Zeilen zurรผck. Eine Tabelle mit weniger als N Zeilen gibt alle Zeilen ohne Fehler zurรผck.
  • 0๏ธโƒฃ Fall Null: LIMIT 0 gibt keine Zeilen zurรผck, was es zu einer kostengรผnstigen Methode macht, Spaltenmetadaten zu untersuchen.
  • ๐Ÿ“ Offset-Syntax: LIMIT 1, 2 รผberspringt eine Zeile und gibt zwei zurรผck, daher wird der Offset zuerst und die Zeilenanzahl an zweiter Stelle geschrieben.
  • ๐Ÿ“„ Seitennummerierungsformel: OFFSET entspricht der SeitengrรถรŸe multipliziert mit der Seitenzahl minus eins, wodurch ein Ergebnissatz in nummerierte Seiten umgewandelt wird.
  • ๏ธ Reihenfolgeabhรคngigkeit: Ohne ORDER BY, MySQL LIMIT kann bei jedem Durchlauf unterschiedliche Zeilen zurรผckgeben, daher ist LIMIT nur bei expliziter Sortierung deterministisch.
  • โš™๏ธ Unterstรผtzung der Aussage: LIMIT begrenzt auรŸerdem die Anzahl der von UPDATE und DELETE betroffenen Zeilen und schรผtzt so eine groรŸe Tabelle vor unbegrenzten Schreibvorgรคngen.
  • ๐Ÿข Leistungshinweis: Ein groรŸer Versatz bewirkt MySQL Jede รผbersprungene Zeile wird gelesen und verworfen, sodass tiefe Seiten langsamer wachsen.

MySQL LIMIT und OFFSET

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 E-Mail 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 E-Mail 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 E-Mail 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.

  1. 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.
  2. 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.
  3. 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.

Hรคufig gestellte Fragen

Ja. Beide akzeptieren eine einfache Zeilenanzahl, wie zum Beispiel Lร–SCHEN FROM members LIMIT 10. Die Offset-Form mit zwei Argumenten ist dort nicht zulรคssig, daher kann nur die Anzahl der betroffenen Zeilen begrenzt werden.

Der Offset beginnt bei null, also beginnt OFFSET 0 in der ersten Zeile und OFFSET 1 in der zweiten. Die Zeilenanzahl selbst ist ein einfacher Wert und wird wie eine normale Zahl gelesen.

Fรผhren Sie eine separate SELECT COUNT(*)-Abfrage mit derselben WHERE-Klausel, aber ohne LIMIT, aus. Die COUNT-Abfrage gibt die Anzahl der vorhandenen Seiten an, wรคhrend die LIMIT-Abfrage die Zeilen der aktuellen Seite zurรผckgibt.

Oft ja. KI-Assistenten in Clients wie z. B. MySQL Werkbank Schreiben Sie eine OFFSET-Abfrage in eine WHERE-Klausel um, die auf dem zuletzt gesehenen Schlรผssel basiert. Stellen Sie sicher, dass die Sortierspalte eindeutig und indiziert ist, bevor Sie der Umschreibung vertrauen.

Weil die generierte Anweisung รผblicherweise die ORDER BY-Klausel weglรคsst. Ohne explizite Sortierung, MySQL Die Zeilen kรถnnen in beliebiger Reihenfolge zurรผckgegeben werden, sodass derselbe LIMIT-Befehl bei jedem Durchlauf ein anderes Ergebnis liefert. Die Sortierung muss selbst implementiert werden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: