Zeilenbegrenzung / Paging (LIMIT/OFFSET, FETCH, ROWNUM, TOP)
Oracle
-- 12c+ standard: OFFSET/FETCH
SELECT name, salary FROM employee
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- Older versions: with ROWNUM
SELECT * FROM (
SELECT name, salary FROM employee ORDER BY salary DESC
) WHERE ROWNUM <= 10;Dient zum Begrenzen/seitenweisen Durchlaufen einer Ergebnismenge. Seit Oracle 12c wird das Standard-OFFSET n ROWS FETCH NEXT m ROWS ONLY unterstützt. Davor wurde die Pseudospalte ROWNUM genutzt; da ROWNUM vor der Sortierung vergeben wird, ist eine umschließende Unterabfrage mit ORDER BY Pflicht.
PostgreSQL
-- LIMIT/OFFSET
SELECT name, salary FROM employee
ORDER BY salary DESC
LIMIT 10 OFFSET 20;
-- Standard equivalent: FETCH
SELECT name, salary FROM employee
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;PostgreSQL unterstützt sowohl LIMIT n OFFSET m als auch die Standardform OFFSET ... FETCH. Große OFFSET-Werte sind langsam; für tiefes Paging ist schlüsselbasierte Paginierung (Keyset / 'WHERE id > last_id') effizienter. LIMIT ohne ORDER BY garantiert keine Ergebnisreihenfolge.
MySQL
-- LIMIT [offset,] row_count
SELECT name, salary FROM employee
ORDER BY salary DESC
LIMIT 10 OFFSET 20;
-- Short form: LIMIT offset, row_count
SELECT name, salary FROM employee ORDER BY salary DESC LIMIT 20, 10;MySQL/MariaDB nutzen das Schlüsselwort LIMIT in zwei Formen: LIMIT row_count OFFSET offset oder LIMIT offset, row_count. MySQL 8.0.19+ akzeptiert auch die Standard-FETCH-Syntax. Für Performance bei tiefem OFFSET wird Keyset-Paginierung empfohlen.
SQL Server
-- First N with TOP
SELECT TOP 10 name, salary FROM employee ORDER BY salary DESC;
-- OFFSET/FETCH for paging (2012+), ORDER BY mandatory
SELECT name, salary FROM employee
ORDER BY salary DESC
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;SQL Server nutzt TOP n (mit den Varianten TOP (n) PERCENT / WITH TIES) für die ersten N Zeilen und seit 2012 OFFSET ... FETCH für Paging. Damit OFFSET/FETCH funktioniert, ist ORDER BY Pflicht. SQL Server hat kein Schlüsselwort LIMIT.
MongoDB
// Paging with skip/limit
db.employee.find()
.sort({ salary: -1 })
.skip(20)
.limit(10)In MongoDB legt limit() die Anzahl zurückgegebener Dokumente fest und skip() die Anzahl übersprungener; zusammen mit sort() ergibt das Paging. Große skip-Werte sind teuer; für tiefes Paging wird eine Bereichsabfrage (Keyset) auf Basis des zuletzt gesehenen Werts bevorzugt.
Redis
# Range read on a sorted set (ZSET):
ZREVRANGE salary_sorted 20 29 # members ranked 21-30
# Range on a list:
LRANGE queue 0 9 # first 10 elementsRedis hat kein SQL-LIMIT, aber Befehle zum Lesen von Bereichen: ZRANGE/ZREVRANGE start stop (indexbasiert) oder ZRANGEBYSCORE ... LIMIT offset count für Sorted Sets; LRANGE für Lists. Diese Befehle ermöglichen paging-ähnlichen Zugriff.
Elasticsearch
GET employee/_search
{
"from": 20,
"size": 10,
"sort": [ { "salary": "desc" } ]
}In Elasticsearch legt 'size' die Anzahl zurückgegebener Treffer fest und 'from' die Anzahl übersprungener (Entsprechung zu LIMIT/OFFSET). from+size darf höchstens index.max_result_window betragen (Standard 10.000); für tiefes Paging nutze 'search_after' (Keyset) oder einen PIT (Point-in-Time).