Zum Inhalt springen
aviral gupta

// B2.2 · ca. 30 Min. · Einstieg

ORDER BY, LIMIT und OFFSET

Nach dieser Lektion bringen Sie ein Ergebnis in die Reihenfolge, die eine Frage verlangt, legen fest, wo fehlende Werte landen, und liefern nur die ersten Zeilen oder eine Seite davon.

Lektion 2 von 5 in B2 Abfragen auf einer Tabelle

Danach können Sie

  • Ein Ergebnis mit ORDER BY sortieren: auf- oder absteigend, nach mehreren Schlüsseln, nach Alias oder Position
  • Sagen, wo NULL standardmäßig einsortiert wird, und es mit NULLS FIRST oder NULLS LAST verschieben
  • Mit LIMIT, OFFSET oder FETCH FIRST die ersten Zeilen oder eine Seite abrufen, auf einer eindeutigen Reihenfolge
  1. Aufwärmen · Aufgabe 1 von 7

    Aufwärmen: SELECT title FROM books; hat kein ORDER BY. In welcher Reihenfolge liefert PostgreSQL die Zeilen verlässlich?

  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie es voraus, bevor Sie weiterlesen. Die Mitglieder traten am 2025-01-15 (Ada), 2025-03-02 (Grace), 2026-02-10 (Linus) und 2026-05-20 (Margaret) bei. Was liefert dies?

    SELECT name FROM members
    ORDER BY joined DESC
    LIMIT 2;
  3. Üben · Aufgabe 3 von 7

    Ergänzen Sie das Schlüsselwort, damit das neueste Buch zuerst kommt.

    SELECT title, year FROM books ORDER BY year ____;
    SELECT title, year FROM books ORDER BY year ;
  4. Üben · Aufgabe 4 von 7

    Ordnen Sie jeder Klausel zu, was sie bewirkt.

  5. Üben · Aufgabe 5 von 7

    Bringen Sie die Zeilen in die Reihenfolge, in der diese Abfrage sie liefert: SELECT title, copies FROM books ORDER BY copies DESC, title LIMIT 4;

    1. 1.Dune (2 Exemplare)
    2. 2.Beloved (1 Exemplar)
    3. 3.Emma (1 Exemplar)
    4. 4.The Hobbit (3 Exemplare)
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Ada und Linus wohnen in Berlin, Grace in München (Munich), und Margaret hat keine Stadt (NULL). Wer kommt zuerst?

    SELECT name FROM members
    ORDER BY city DESC
    LIMIT 1;
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe. Schreiben Sie mit der Bibliothek des Beispiels zwei Abfragen: Seite 2 des Katalogs, zwei Bücher pro Seite, nach Titel sortiert (Titel und Jahr); und die Mitgliederliste nach Stadt sortiert, Mitglieder ohne Stadt zuerst, bei gleicher Stadt nach Name. Ändern Sie dann die Seitennummer und sagen Sie die Zeilen voraus, bevor Sie ausführen.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Vier Reihenfolgen der Bibliothek

setup.sql lädt die Bücher und Mitglieder der Bibliothek aus Modul B1. main.sql sortiert sie auf vier Arten: die neuesten Bücher zuerst mit einer Grenze, nach drei Schlüsseln, die Mitglieder ohne Stadt zuerst, und eine Seite mit zwei Büchern. Auf Ihrem Computer: psql -X -q -v ON_ERROR_STOP=1 -f setup.sql -f main.sql.

main.sql

-- 1. The three newest books.
SELECT title, year
FROM books
ORDER BY year DESC
LIMIT 3;

-- 2. By genre, then most copies first, then title.
SELECT genre, title, copies
FROM books
ORDER BY genre, copies DESC, title;

-- 3. Members without a city first, then by name.
SELECT name, city
FROM members
ORDER BY city NULLS FIRST, name;

-- 4. Page 2 of the catalogue, two books per page.
SELECT id, title
FROM books
ORDER BY id
LIMIT 2 OFFSET 2;

setup.sql

CREATE TABLE books (
  id integer,
  title text,
  author text,
  year integer,
  genre text,
  copies integer
);

INSERT INTO books VALUES
  (1, 'Dune', 'Frank Herbert', 1965, 'sci-fi', 2),
  (2, 'Emma', 'Jane Austen', 1815, 'classic', 1),
  (3, 'Kindred', 'Octavia E. Butler', 1979, 'sci-fi', 1),
  (4, 'Beloved', 'Toni Morrison', 1987, 'fiction', 1),
  (5, 'The Hobbit', 'J. R. R. Tolkien', 1937, 'fantasy', 3),
  (6, 'Neuromancer', 'William Gibson', 1984, 'sci-fi', 1);

CREATE TABLE members (
  id integer,
  name text,
  email text,
  city text,
  joined date
);

INSERT INTO members VALUES
  (1, 'Ada', 'ada@example.com', 'Berlin', '2025-01-15'),
  (2, 'Grace', 'grace@example.com', 'Munich', '2025-03-02'),
  (3, 'Linus', NULL, 'Berlin', '2026-02-10'),
  (4, 'Margaret', 'margaret@example.com', NULL, '2026-05-20');

Ausführen mit

psql -X -q -v ON_ERROR_STOP=1 -f setup.sql -f main.sql

Ausgabe

    title    | year
-------------+------
 Beloved     | 1987
 Neuromancer | 1984
 Kindred     | 1979
(3 rows)

  genre  |    title    | copies
---------+-------------+--------
 classic | Emma        |      1
 fantasy | The Hobbit  |      3
 fiction | Beloved     |      1
 sci-fi  | Dune        |      2
 sci-fi  | Kindred     |      1
 sci-fi  | Neuromancer |      1
(6 rows)

   name   |  city
----------+--------
 Margaret |
 Ada      | Berlin
 Linus    | Berlin
 Grace    | Munich
(4 rows)

 id |  title
----+---------
  3 | Kindred
  4 | Beloved
(2 rows)
  • ORDER BY year DESC sortiert zuerst, und LIMIT 3 behält danach die ersten drei Zeilen des sortierten Ergebnisses.
  • Die drei Sci-Fi-Bücher sind im Genre gleich, also entscheidet copies DESC (Dune zuerst); Kindred und Neuromancer sind auch bei copies gleich, also entscheidet title.
  • Margaret hat keine Stadt. NULLS FIRST setzt sie nach oben; ohne es stünde sie am Ende.
  • OFFSET 2 überspringt die ids 1 und 2, und LIMIT 2 liefert die nächsten zwei: Seite 2.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser PostgreSQL herunter (bis zu 10.1 MB) und speichert es im Cache. Jeder Lauf beginnt mit einer leeren Datenbank. Ihr Code bleibt auf Ihrem Gerät.

Übungen

Übung 1 von 2

Die ältesten Bücher und die meisten Exemplare

Schreiben Sie zwei Abfragen. Erstens: Titel und Jahr der zwei ältesten Bücher, das älteste zuerst, mit LIMIT. Zweitens: Titel und Exemplare der drei Bücher mit den meisten Exemplaren, die meisten zuerst, und Bücher mit gleich vielen Exemplaren alphabetisch; nutzen Sie FETCH FIRST statt LIMIT.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser PostgreSQL herunter (bis zu 10.1 MB) und speichert es im Cache. Jeder Lauf beginnt mit einer leeren Datenbank. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    ORDER BY year sortiert das älteste zuerst; LIMIT 2 behält dann zwei Zeilen.

  2. Hinweis 2

    Vier Bücher haben ein Exemplar. Ein zweiter Sortierschlüssel, title, entscheidet, welches davon zuerst kommt.

  3. Hinweis 3

    ORDER BY copies DESC, title FETCH FIRST 3 ROWS ONLY;

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

SELECT title, year
FROM books
ORDER BY year
LIMIT 2;

SELECT title, copies
FROM books
ORDER BY copies DESC, title
FETCH FIRST 3 ROWS ONLY;
Auf dem eigenen Computer ausführen

Installieren Sie PostgreSQL 18 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.sql

-- setup.sql has loaded books and members.
SELECT title, year, copies FROM books;

test.sql

-- test: Die zwei Abfragen zeigen die zwei ältesten Bücher, dann die drei mit den meisten Exemplaren
-- output:
--    title    | year
-- ------------+------
--  Emma       | 1815
--  The Hobbit | 1937
-- (2 rows)
--
--    title    | copies
-- ------------+--------
--  The Hobbit |      3
--  Dune       |      2
--  Beloved    |      1
-- (3 rows)

setup.sql

CREATE TABLE books (
  id integer,
  title text,
  author text,
  year integer,
  genre text,
  copies integer
);

INSERT INTO books VALUES
  (1, 'Dune', 'Frank Herbert', 1965, 'sci-fi', 2),
  (2, 'Emma', 'Jane Austen', 1815, 'classic', 1),
  (3, 'Kindred', 'Octavia E. Butler', 1979, 'sci-fi', 1),
  (4, 'Beloved', 'Toni Morrison', 1987, 'fiction', 1),
  (5, 'The Hobbit', 'J. R. R. Tolkien', 1937, 'fantasy', 3),
  (6, 'Neuromancer', 'William Gibson', 1984, 'sci-fi', 1);

CREATE TABLE members (
  id integer,
  name text,
  email text,
  city text,
  joined date
);

INSERT INTO members VALUES
  (1, 'Ada', 'ada@example.com', 'Berlin', '2025-01-15'),
  (2, 'Grace', 'grace@example.com', 'Munich', '2025-03-02'),
  (3, 'Linus', NULL, 'Berlin', '2026-02-10'),
  (4, 'Margaret', 'margaret@example.com', NULL, '2026-05-20');

psql führt die Dateien auf Ihrem eigenen PostgreSQL-Server aus. Nehmen Sie eine leere Datenbank, die Sie wegwerfen können: Hängen Sie -d und ihren Namen an den Befehl an.

Programm ausführen:

psql -X -q -v ON_ERROR_STOP=1 -f setup.sql -f main.sql

Für die Prüfungen gibt es auf Ihrem Computer noch keinen Befehl. Sie stehen in test.sql: Jede Prüfabfrage gibt t aus, wenn sie besteht.

Übung 2 von 2

Seite drei des Katalogs

Der Katalog listet die Bücher alphabetisch nach Titel, zwei pro Seite. Der Starter soll Seite 3 zeigen (Titel und Autor), hat aber kein ORDER BY und zeigt darum irgendwelche zwei Zeilen. Korrigieren Sie ihn, sodass er den fünften und sechsten Titel in alphabetischer Reihenfolge liefert. Fügen Sie dann eine zweite Abfrage hinzu: Name und Beitrittsdatum des Mitglieds, das als zweitletztes beigetreten ist.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser PostgreSQL herunter (bis zu 10.1 MB) und speichert es im Cache. Jeder Lauf beginnt mit einer leeren Datenbank. Ihr Code bleibt auf Ihrem Gerät.

Hinweise
  1. Hinweis 1

    Setzen Sie ORDER BY title vor LIMIT: Ohne Sortierung hat „Seite 3“ keine Bedeutung.

  2. Hinweis 2

    Seite n mit zwei Zeilen pro Seite überspringt 2 × (n − 1) Zeilen: OFFSET 4 für Seite 3.

  3. Hinweis 3

    Das zweitjüngste Mitglied: ORDER BY joined DESC, eine Zeile überspringen, eine nehmen: LIMIT 1 OFFSET 1.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

-- Page 3 of the catalogue, two books per page.
SELECT title, author
FROM books
ORDER BY title
LIMIT 2 OFFSET 4;

SELECT name, joined
FROM members
ORDER BY joined DESC
LIMIT 1 OFFSET 1;
Auf dem eigenen Computer ausführen

Installieren Sie PostgreSQL 18 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.sql

-- Page 3 of the catalogue, two books per page.
SELECT title, author
FROM books
LIMIT 2 OFFSET 2;

test.sql

-- test: Seite 3 ist Neuromancer und The Hobbit, das zweitjüngste Mitglied ist Linus
-- output:
--     title    |      author
-- -------------+------------------
--  Neuromancer | William Gibson
--  The Hobbit  | J. R. R. Tolkien
-- (2 rows)
--
--  name  |   joined
-- -------+------------
--  Linus | 2026-02-10
-- (1 row)

setup.sql

CREATE TABLE books (
  id integer,
  title text,
  author text,
  year integer,
  genre text,
  copies integer
);

INSERT INTO books VALUES
  (1, 'Dune', 'Frank Herbert', 1965, 'sci-fi', 2),
  (2, 'Emma', 'Jane Austen', 1815, 'classic', 1),
  (3, 'Kindred', 'Octavia E. Butler', 1979, 'sci-fi', 1),
  (4, 'Beloved', 'Toni Morrison', 1987, 'fiction', 1),
  (5, 'The Hobbit', 'J. R. R. Tolkien', 1937, 'fantasy', 3),
  (6, 'Neuromancer', 'William Gibson', 1984, 'sci-fi', 1);

CREATE TABLE members (
  id integer,
  name text,
  email text,
  city text,
  joined date
);

INSERT INTO members VALUES
  (1, 'Ada', 'ada@example.com', 'Berlin', '2025-01-15'),
  (2, 'Grace', 'grace@example.com', 'Munich', '2025-03-02'),
  (3, 'Linus', NULL, 'Berlin', '2026-02-10'),
  (4, 'Margaret', 'margaret@example.com', NULL, '2026-05-20');

psql führt die Dateien auf Ihrem eigenen PostgreSQL-Server aus. Nehmen Sie eine leere Datenbank, die Sie wegwerfen können: Hängen Sie -d und ihren Namen an den Befehl an.

Programm ausführen:

psql -X -q -v ON_ERROR_STOP=1 -f setup.sql -f main.sql

Für die Prüfungen gibt es auf Ihrem Computer noch keinen Befehl. Sie stehen in test.sql: Jede Prüfabfrage gibt t aus, wenn sie besteht.

Häufige Fehler

LIMIT vor ORDER BY

SELECT title, year
FROM books
LIMIT 3
ORDER BY year;

Was psql ausgibt

ERROR:  syntax error at or near "ORDER"

Warum, und die Lösung

Die Klauseln haben eine feste Reihenfolge: SELECT, FROM, WHERE, ORDER BY und danach LIMIT und OFFSET. Erst werden die Zeilen sortiert, dann nimmt die Grenze die ersten Zeilen des sortierten Ergebnisses. Schreiben Sie also ORDER BY year LIMIT 3.

Eine Position, die nicht in der Select-Liste steht

SELECT title, year
FROM books
ORDER BY 3;

Was psql ausgibt

ERROR:  ORDER BY position 3 is not in select list

Warum, und die Lösung

Eine Zahl in ORDER BY ist die Position einer Ergebnisspalte, ab 1 in der Select-Liste gezählt, nicht in der Tabelle. Diese Select-Liste hat zwei Spalten, erlaubt sind also nur 1 und 2. Schreiben Sie stattdessen den Spaltennamen, ORDER BY year; das funktioniert auch dann noch, wenn jemand der Select-Liste eine Spalte hinzufügt.

DISTINCT und ein Sortierschlüssel, der nicht gewählt ist

SELECT DISTINCT genre
FROM books
ORDER BY year;

Was psql ausgibt

ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list

Warum, und die Lösung

Nach DISTINCT steht eine Zeile für mehrere Bücher: sci-fi steht für Bücher aus 1965, 1979 und 1984 und hat darum kein einzelnes Jahr, nach dem sortiert werden könnte. Sortieren Sie bei DISTINCT nur nach gewählten Spalten: ORDER BY genre.

PostgreSQL im Browser: PGlite 0.5.8 (PostgreSQL 18.3), Apache-2.0 und PostgreSQL License. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Ohne ORDER BY gibt es keine Reihenfolge

Eine Tabelle hat keine eingebaute Reihenfolge, und eine Abfrage ohne ORDER BY liefert ihre Zeilen in unbestimmter Reihenfolge: oft in der Einfügereihenfolge, doch das ist nicht zugesagt und kann sich ändern. ORDER BY year sortiert aufsteigend (ASC, der Standard): das Kleinste zuerst, Text alphabetisch. ORDER BY year DESC sortiert absteigend. Bei mehreren Schlüsseln, ORDER BY genre, copies DESC, title, sortiert der zweite nur Zeilen, die im ersten gleich sind, der dritte nur Zeilen, die in beiden gleich sind. Jeder Schlüssel hat seine eigene Richtung: In ORDER BY genre, title DESC ist nur title absteigend. Zeilen, die in allen Schlüsseln gleich sind, kommen in beliebiger Reihenfolge.

Wonach Sie sortieren können, und wo NULL landet

ORDER BY nimmt eine Spalte, einen Ausdruck wie copies * 2, einen Alias aus der Select-Liste oder die Position einer Ergebnisspalte: ORDER BY 2 sortiert nach der zweiten Spalte. Ein Alias muss allein stehen: ORDER BY published funktioniert, ORDER BY 2026 - published scheitert mit column "published" does not exist. Auch eine Position jenseits der Select-Liste scheitert. NULL, ein fehlender Wert, wird sortiert, als wäre es größer als jeder andere Wert. Margaret, die keine Stadt hat, steht darum bei ORDER BY city am Ende und bei ORDER BY city DESC am Anfang. NULLS FIRST oder NULLS LAST hinter einem Schlüssel ändert das für diesen Schlüssel.

LIMIT und OFFSET schneiden einen Ausschnitt heraus

LIMIT 3 liefert höchstens drei Zeilen; OFFSET 2 überspringt zwei Zeilen vor der ersten gelieferten. Mit beiden wird zuerst übersprungen: LIMIT 2 OFFSET 2 liefert die Zeilen 3 und 4. Seite n einer Liste mit 10 Zeilen pro Seite ist also LIMIT 10 OFFSET 10 * (n - 1). LIMIT und OFFSET sind PostgreSQLs Schreibweise; der SQL-Standard schreibt FETCH FIRST 3 ROWS ONLY und OFFSET 2 ROWS, was PostgreSQL ebenfalls annimmt. LIMIT steht nach ORDER BY, und ohne ORDER BY erhalten Sie irgendwelche drei Zeilen, nicht die ersten drei. Die Reihenfolge muss zudem eindeutig sein: Bei Gleichstand nehmen Sie einen Schlüssel wie id oder title dazu.

Quellen

Zuletzt geprüft am 30. September 2026