Aufwärmen · Aufgabe 1 von 7
// 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.
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
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;Ü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 ;Üben · Aufgabe 4 von 7
Ordnen Sie jeder Klausel zu, was sie bewirkt.
Ü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.Dune (2 Exemplare)
- 2.Beloved (1 Exemplar)
- 3.Emma (1 Exemplar)
- 4.The Hobbit (3 Exemplare)
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;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.sqlAusgabe
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
Hinweis 1
ORDER BY year sortiert das älteste zuerst; LIMIT 2 behält dann zwei Zeilen.
Hinweis 2
Vier Bücher haben ein Exemplar. Ein zweiter Sortierschlüssel, title, entscheidet, welches davon zuerst kommt.
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.sqlFü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
Hinweis 1
Setzen Sie ORDER BY title vor LIMIT: Ohne Sortierung hat „Seite 3“ keine Bedeutung.
Hinweis 2
Seite n mit zwei Zeilen pro Seite überspringt 2 × (n − 1) Zeilen: OFFSET 4 für Seite 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.sqlFü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 listWarum, 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 listWarum, 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.