CodeGym /Kurse /SQL SELF /Verwendung von OFFSET zum Überspringen von Zeilen und Auf...

Verwendung von OFFSET zum Überspringen von Zeilen und Aufbau von Pagination

SQL SELF
Level 3 , Lektion 1
Verfügbar

Lass mich mal fragen: Was machst du, wenn du in einem Online-Shop zu viele Produkte auf einer Seite findest? Genau, du klickst auf die nächste Seite. Und was passiert im Hintergrund? Da läuft SQL-Magie – das OFFSET-Statement wird genutzt, um Zeilen zu überspringen. Heute erfährst du, was OFFSET ist, wofür es gebraucht wird, wie du es benutzt und warum es die Grundlage für Pagination von Daten ist.

OFFSET ist ein Schlüsselwort in SQL, das es dir erlaubt, eine bestimmte Anzahl von Zeilen im Query-Ergebnis zu überspringen. Das ist wie beim Umblättern einer Buchseite: Du kannst die ersten 10 Zeilen "überspringen" und ab der 11. Zeile weitermachen.

Syntax

SELECT spalte1, spalte2
FROM tabelle
OFFSET anzahl_zeilen;
  • OFFSET – das Schlüsselwort zum Überspringen von Zeilen.
  • anzahl_zeilen – die Anzahl der Zeilen, die übersprungen werden sollen.

Ein einfaches Beispiel für die Verwendung von OFFSET

Nehmen wir an, wir haben eine Tabelle students mit folgenden Daten:

id name age
1 Alisa 22
2 Bob 24
3 Klara 23
4 Dan 21
5 Eva 25

Wir wollen alle Studenten ab dem dritten anzeigen. Dafür können wir folgenden Query nutzen:

SELECT *
FROM students
OFFSET 2;

Ergebnis:

id name age
3 Klara 23
4 Dan 21
5 Eva 25

SQL hat die ersten zwei Zeilen (Alisa und Bob) "übersprungen" und das Ergebnis ab der dritten Zeile geliefert. Das ist wie mit Lesezeichen: "Diese Seite haben wir schon gelesen, machen wir mit der nächsten weiter."

Kombinieren von OFFSET mit LIMIT

OFFSET wird meistens zusammen mit LIMIT verwendet. So kannst du Zeilen überspringen und gleichzeitig die Anzahl der zurückgegebenen Zeilen begrenzen. Das ist besonders praktisch für Pagination (page = Seite) – also das Anzeigen von Daten in Portionen, jeweils ein paar Zeilen auf einmal.

Angenommen, wir wollen jeweils 2 Einträge anzeigen und ab der dritten Zeile starten. Der Query sieht dann so aus:

SELECT *
FROM students
LIMIT 2 
OFFSET 2;

Ergebnis:

id name age
3 Klara 23
4 Dan 21

So läuft das ab:

  1. OFFSET 2 überspringt die ersten zwei Zeilen: Alisa und Bob.
  2. LIMIT 2 nimmt dann nur zwei Zeilen von den übrigen.

Pagination aufbauen

Jetzt kommen wir zum spannendsten Teil – Pagination bauen. Stell dir vor, du baust eine Web-App mit einer Studentenliste. Auf einer Seite willst du 2 Einträge anzeigen. Wie geht das?

Das Grundprinzip:

  • Die erste Seite überspringt 0 Zeilen: OFFSET 0.
  • Die zweite Seite überspringt 2 Zeilen: OFFSET 2.
  • Die dritte Seite überspringt 4 Zeilen: OFFSET 4.
  • Und so weiter...

Beispiel: Zeige die zweite Seite

Auf der ersten Seite werden die Einträge 1 und 2 (Alisa und Bob) angezeigt. Auf der zweiten Seite – Einträge 3 und 4 (Klara und Dan).

SELECT *
FROM students
ORDER BY id
LIMIT 2 
OFFSET 2;

Ergebnis:

id name age
3 Klara 23
4 Dan 21

Beispiel: Zeige die dritte Seite

Auf der dritten Seite – Einträge 5 und 6 (falls es sie gibt).

SELECT *
FROM students
ORDER BY id
LIMIT 2 
OFFSET 4;

Ergebnis:

id name age
5 Eva 25

Formel zur Berechnung von OFFSET

Beim Aufbau von Pagination-Systemen kannst du folgende Formel nutzen, um das Ganze zu automatisieren:

OFFSET = (seiten_nummer - 1) * anzahl_einträge_pro_seite

Zum Beispiel:

  • Für die erste Seite: (1 - 1) * 2 = 0.
  • Für die zweite Seite: (2 - 1) * 2 = 2.
  • Für die dritte Seite: (3 - 1) * 2 = 4.

Wichtige Performance-Hinweise

Wenn du mit großen Tabellen arbeitest, kann die Nutzung von OFFSET ineffizient werden, besonders auf späteren Seiten. Der Grund: PostgreSQL scannt trotzdem alle übersprungenen Zeilen. Zum Beispiel zwingt ein Query mit OFFSET 10000 die DB, die ersten 10.000 Zeilen durchzugehen, bevor Ergebnisse geliefert werden. In solchen Fällen kannst du Alternativen wie die Nutzung eines eindeutigen Identifiers als Pagination-Marker in Betracht ziehen.

Alternative: Pagination mit Cursor

Zur Optimierung kannst du den "Cursor"-Ansatz nutzen. Anstatt Zeilen mit OFFSET zu überspringen, merkst du dir die IDs der letzten Zeile auf der vorherigen Seite und nutzt sie für den nächsten Query:

SELECT *
FROM students
WHERE id > letzte_ausgegebene_id
ORDER BY id
LIMIT 2;

Dieser Ansatz kann die Arbeit mit großen Tabellen deutlich beschleunigen.

Praktische Anwendung von Pagination

Pagination wird in den meisten Web-Apps genutzt: Online-Shops, Blogs, Admin-Panels. Zum Beispiel:

  • Anzeige einer Produktliste im Online-Shop;
  • Anzeige einer User-Liste im CRM-System;
  • Seitenausgabe eines News-Feeds.

Auch bei der Analyse großer Datenmengen kann Pagination helfen, um mit kleinen Portionen zu arbeiten.

Typische Fehler bei der Nutzung von OFFSET

Mit OFFSET zu arbeiten, kann manchmal tricky sein, besonders am Anfang. Hier ein paar typische Fehler:

Fehlende Sortierung. Wenn du kein ORDER BY angibst, kann die Reihenfolge der Zeilen im OFFSET-Ergebnis unvorhersehbar sein.

Falscher Query:

SELECT * FROM students
OFFSET 5;

Richtiger Query:

SELECT * FROM students
ORDER BY id
OFFSET 5;

Falscher OFFSET-Wert. Wenn du einen zu großen Wert angibst, bekommst du ein leeres Ergebnis.

Performance-Probleme. Wie oben schon erwähnt, kann ein großes OFFSET auf späten Seiten langsam sein.

Fehlende Filter. Wenn du OFFSET und LIMIT ohne Filter (WHERE) nutzt, bekommst du vielleicht unnötige Daten, was die Performance verschlechtern kann.

Operator-Reihenfolge. Die Reihenfolge der Operatoren in SQL ist fest: Erst kommt LIMIT, dann OFFSET. Du kannst Operatoren weglassen, aber nicht die Reihenfolge ändern.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION