Limit (SQL)

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

Um Abfragen zu beschleunigen kann man eine maximale Anzahl an Ergebnissen festlegen, somit hört das DBMS nach X Werten auf nach weiteren zu suchen.

MySQL

Unter MySQL gibt es für diesen Fall die Anweisung LIMIT, diese hat zwei Parameter, wobei der letzte optional ist.

SELECT * from testtable WHERE id = 1 LIMIT 1

Diese Abfrage wählt nur ein Element aus, auch wenn es mehrere Elemente mit der ID 1 geben würde, außerdem wird direkt nach der 1. Abfrage aufgehört nach weiteren zu suchen.

SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10,30

Diese Abfrage wählt 30 Elemente aus, jedoch werden diese nicht vom Anfang genommen, sondern erst ab dem 10. Element: Der erste Parameter von LIMIT beschreibt dabei den offset der Zeilen, und der zweite Parameter die maximale Anzahl der Zeilen. Dies bedeutet wenn die id von 1-100 eindeutig durchnummeriert ist, werden die Elemente 11-40 ausgegeben.

PostgreSQL

Unter PostgreSQL gibt es ähnlich wie bei MySQL die Anweisung LIMIT, auch mit den beiden Parametern, jedoch wird der zweite Parameter mit dem Schlüsselwort OFFSET eingetragen.

SELECT * from testtable WHERE id = 1 LIMIT 1

Diese Abfrage wählt nur ein Element aus, auch wenn es mehrere Elemente mit der ID 1 geben würde, außerdem wird direkt nach der 1. Abfrage aufgehört nach weiteren zu suchen.

SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10 OFFSET 30

Diese Abfrage wählt 10 Elemente aus, jedoch werden diese nicht vom Anfang genommen, sondern erst ab dem 30.Element. Dies bedeutet wenn die id von 1-100 eindeutig durchnummeriert ist, werden die Elemente 30-40 ausgegeben.

Oracle

Unter Oracle gibt es für diese Art der Anweisungen eine weitere Spalte, diese heißt ROWNUM. Sie enthält die Zeilennummer, so dass man mit dieser wie mit jeder anderen Spalte arbeiten kann.

SELECT * from testtable WHERE id = 1 AND rownum = 1

Diese Abfrage wählt nur ein Element aus, auch wenn es mehrere Elemente mit der ID 1 geben würde, außerdem wird direkt nach der 1. Abfrage aufgehört nach weiteren zu suchen.


Eine Abfrage auf rownum > 1 ist nicht möglich, da die rownum erzeugt wird nachdem der Query Optimizer die WHERE Klausel ausgwertet hat. Siehe http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

MSSQL

MSSQL besitzt die Anweisung TOP für die Begrenzung der Ergebnise. Unter SQL CE existiert die Funktion nicht, es gibt auch keine Alternative.

SELECT TOP 10 * FROM testtable WHERE id = 1

Einen Offset oder ähnliches wird von MSSQL nicht unterstützt oder angeboten.

DB2

DB2 hat für die die Begrenzung der Ergebnisse die Anweisung FETCH FIRST X ROWS ONLY.

SELECT * FROM testtable FETCH FIRST 10 ROWS ONLY;