Limit (SQL): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
(MSSQL)
K
 
(3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
 
==MySQL==
 
==MySQL==
 
Unter [[MySQL]] gibt es für diesen Fall die Anweisung ''LIMIT'', diese hat zwei Parameter, wobei der letzte optional ist.  
 
Unter [[MySQL]] gibt es für diesen Fall die Anweisung ''LIMIT'', diese hat zwei Parameter, wobei der letzte optional ist.  
<code=sql>SELECT * from testtable WHERE id = 1 LIMIT 1</code=sql>
+
<syntaxhighlight lang="sql">SELECT * from testtable WHERE id = 1 LIMIT 1</syntaxhighlight>
 
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.
 
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.
  
<code=sql>SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10,30</code=sql>
+
<syntaxhighlight lang="sql">SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10,30</syntaxhighlight>
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.
+
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==
 
==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.
 
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.
<code=sql>SELECT * from testtable WHERE id = 1 LIMIT 1</code=sql>
+
<syntaxhighlight lang="sql">SELECT * from testtable WHERE id = 1 LIMIT 1</syntaxhighlight>
 
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.
 
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.
  
<code=sql>SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10 OFFSET 30</code=sql>
+
<syntaxhighlight lang="sql">SELECT * FROM testtable WHERE id >1 ORDER BY id LIMIT 10 OFFSET 30</syntaxhighlight>
 
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.
 
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==
 
==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.
 
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.
<code=sql>SELECT * from testtable WHERE id = 1 AND rownum = 1</code=sql>
+
<syntaxhighlight lang="sql">SELECT * from testtable WHERE id = 1 AND rownum = 1</syntaxhighlight>
 
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.
 
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.
  
<code=sql>SELECT * FROM testtable WHERE id > 1 AND rownum BETWEEN 30 AND 40 ORDER BY id </code=sql>
+
 
Diese Abfrage wählt die Elemente 30-40 aus, ähnlich der ''LIMIT 10,30'' Abfrage aus MySQL.
+
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==
 
[[MSSQL]] besitzt die Anweisung ''TOP'' für die Begrenzung der Ergebnise. Unter SQL CE existiert die Funktion nicht, es gibt auch keine Alternative.
 
[[MSSQL]] besitzt die Anweisung ''TOP'' für die Begrenzung der Ergebnise. Unter SQL CE existiert die Funktion nicht, es gibt auch keine Alternative.
<code=sql>SELECT TOP 10 * FROM testtable WHERE id = 1</code=sql>
+
<syntaxhighlight lang="sql">SELECT TOP 10 * FROM testtable WHERE id = 1</syntaxhighlight>
  
 
Einen Offset oder ähnliches wird von MSSQL nicht unterstützt oder angeboten.
 
Einen Offset oder ähnliches wird von MSSQL nicht unterstützt oder angeboten.
Zeile 34: Zeile 34:
 
[[DB2]] hat für die die Begrenzung der Ergebnisse die Anweisung ''FETCH FIRST X ROWS ONLY''.
 
[[DB2]] hat für die die Begrenzung der Ergebnisse die Anweisung ''FETCH FIRST X ROWS ONLY''.
  
<code=sql>SELECT * FROM table FETCH FIRST 10 ROWS ONLY;</code=sql>
+
<syntaxhighlight lang="sql">SELECT * FROM testtable FETCH FIRST 10 ROWS ONLY;</syntaxhighlight>
  
  

Aktuelle Version vom 2. April 2018, 14:42 Uhr

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;