Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So begrenzen Sie Zeilen in einem SQL Server-Ergebnissatz

Problem:

Sie möchten die Zeilen in einer SQL Server-Ergebnismenge begrenzen.

Beispiel:

Unsere Datenbank hat eine Tabelle namens toy mit Daten in den Spalten id , name und price .

id Name Preis
161 Fahrrad-BMX 200,00
121 Der Roboter Tobie 185,50
213 Angelspiel 25.00
102 Tierrätsel 45,80
111 Rennstrecken-Set 126,70
233 Einfache Steine 21.00

Lassen Sie uns die Namen und Preise der Spielzeuge auswählen. Aber wir müssen nur die ersten fünf Zeilen sehen.

Lösung 1:

SELECT name, price
FROM toy
ORDER BY price
OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;

Hier ist das Ergebnis der Abfrage:

name Preis
Einfache Bausteine 21.00
Angelspiel 25.00
Tierrätsel 45,80
Rennstrecken-Set 126,70
Der Roboter Tobie 185,50

Diskussion:

Um die Zeilen in der Ergebnismenge zu begrenzen, verwenden Sie ORDER BY mit den optionalen OFFSET- und FETCH-Klauseln. Zuerst sortiert die Abfrage die Zeilen (ORDER BY). Anschließend teilen Sie SQL Server mit, welche die erste Zeile in der Ergebnismenge sein soll (OFFSET...ROWS) und wie viele Zeilen zurückgegeben werden sollen (FETCH...ONLY).

Die OFFSET-Klausel steht unmittelbar nach ORDER BY. Die Ganzzahl gibt die erste zu zählende Zeile an (in SQL Server ist die erste Zeile 0, die zweite Zeile 1 usw.), gefolgt vom Schlüsselwort ROW oder ROWS. Sie können entweder ROW oder ROWS verwenden, aber es wird empfohlen, ROW für 1 Zeile und ROWS für 0 und mehrere Zeilen zu verwenden. Sehen Sie sich das Bild an:

In unserem Beispiel sortieren wir nach Preis (ORDER BY price ) und beginnen Sie mit der Rückgabe von Ergebnissen ab der ersten Zeile (OFFSET 0 ROWS ). Dann verwenden wir FETCH mit dem Schlüsselwort FIRST. Sie können FIRST oder NEXT verwenden; Es wird empfohlen, FIRST zu verwenden, wenn Sie mit der ersten Zeile beginnen, ohne Datensätze auszulassen, und NEXT, wenn Zeilen ausgelassen werden (d. h. wenn der OFFSET größer als 0 ist).

Schließlich haben wir die Anzahl der auszuwählenden Zeilen und das Schlüsselwort ROWS ONLY. Verwenden Sie ROWS ONLY, wenn Sie mehrere Zeilen zurückgeben, und ROW ONLY, wenn Sie das Ergebnis auf eine Zeile beschränken. In unserem Beispiel beschränken wir sie auf fünf Zeilen (FETCH FIRST 5 ROWS ONLY ).

Unten haben wir eine weitere Abfrage, die Zeilen auf fünf begrenzt, aber in der fünften Zeile in der Tabelle beginnt (OFFSET 4 ROWS ):

Lösung 2:

SELECT name, price
FROM toy
ORDER BY price
OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;

Hier ist das Ergebnis der Abfrage:

name Preis
Der Roboter Tobie 185,50
Fahrrad-BMX 200,00

Beachten Sie, dass diese Abfrage nur zwei Zeilen zurückgibt, nicht die fünf angegebenen. Sehen Sie sich das Bild an:

Warum nur zwei Reihen? Denn diese Tabelle enthält nur sechs Datensätze. Wenn wir die ersten vier Zeilen weglassen und bei Zeile 5 beginnen, bleiben nur zwei Zeilen übrig.

SQL Server hat eine andere Möglichkeit, Zeilen einzuschränken:die TOP-Klausel.

Lösung 3:

SELECT TOP 3
 name, price
FROM toy
ORDER BY price;

Hier ist das Ergebnis der Abfrage:

name Preis
Einfache Bausteine 21.00
Angelspiel 25.00
Tierrätsel 45,80

Wenn Sie keine Zeilen auslassen müssen, können Sie die TOP-Klausel von SQL Server verwenden, um die zurückgegebenen Zeilen einzuschränken. Es wird unmittelbar nach SELECT platziert. Auf das Schlüsselwort TOP folgt eine Ganzzahl, die die Anzahl der zurückzugebenden Zeilen angibt. In unserem Beispiel haben wir nach Preis bestellt und begrenzte dann die zurückgegebenen Zeilen auf 3.

Im Gegensatz zur Methode OFFSET – FETCH erfordert TOP kein ORDER BY. Hier ist ein ähnliches Beispiel, aber ohne die Datensätze zu sortieren:

Lösung 4:

SELECT TOP 3
 name, price
FROM toy;

Hier ist das Ergebnis der Abfrage:

Beachten Sie, dass verschiedene Datensätze zurückgegeben wurden. Normalerweise (aber nicht immer) werden die Zeilen in der Reihenfolge angezeigt, in der die Datensätze in die Tabelle eingefügt wurden.

Wir empfehlen die Verwendung von OFFSET und FETCH anstelle von TOP, da OFFSET und FETCH SQL-Standard sind; TOP ist spezifisch für T-SQL.