Problém:
Chcete omezit řádky v sadě výsledků SQL Server.
Příklad:
Naše databáze obsahuje tabulku s názvem toy
s údaji ve sloupcích id
, name
a price
.
id | jméno | cena |
---|---|---|
161 | Na kole BMX | 200,00 |
121 | Robot Tobie | 185,50 |
213 | Hra s rybařením | 25,00 |
102 | Hádanky se zvířaty | 45,80 |
111 | Sada závodní dráhy | 126,70 |
233 | Easy Bricks | 21:00 |
Pojďme vybrat názvy a ceny hraček. Ale potřebujeme vidět pouze prvních pět řádků.
Řešení 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Zde je výsledek dotazu:
name | cena |
---|---|
Easy Bricks | 21:00 |
Hra s rybařením | 25,00 |
Hádanky se zvířaty | 45,80 |
Sada závodní dráhy | 126,70 |
Robot Tobie | 185,50 |
Diskuse:
Chcete-li omezit řádky v sadě výsledků, použijte ORDER BY s volitelnými klauzulemi OFFSET a FETCH. Nejprve dotaz seřadí řádky (ORDER BY). Potom sdělíte SQL Serveru, který by měl být prvním řádkem ve výsledné sadě (OFFSET...ROWS) a kolik řádků vrátit (FETCH...ONLY).
Klauzule OFFSET je umístěna bezprostředně za ORDER BY. Celé číslo označuje první řádek, který se má počítat (na serveru SQL Server je první řádek 0, druhý řádek je 1 atd.), za nímž následuje klíčové slovo ROW nebo ROWS. Můžete použít buď ROW nebo ROWS, ale doporučuje se použít ROW pro 1 řádek a ROWS pro 0 a více řádků. Podívejte se na obrázek:
V našem příkladu třídíme podle ceny (ORDER BY price
) a začněte vracet výsledky z prvního řádku (OFFSET 0 ROWS
). Poté použijeme FETCH s klíčovým slovem FIRST. Můžete použít FIRST nebo NEXT; doporučuje se použít FIRST, pokud začínáte od prvního řádku bez vynechání jakýchkoli záznamů, a NEXT, pokud jsou některé řádky vynechány (tj. pokud je OFFSET větší než 0).
Nakonec máme počet řádků k výběru a klíčové slovo ROWS ONLY. Použijte ROWS ONLY, pokud vracíte více řádků a ROW ONLY omezíte výsledek na jeden řádek. V našem příkladu to omezíme na pět řádků (FETCH FIRST 5 ROWS ONLY
).
Níže máme další dotaz, který omezuje řádky na pět, ale začíná od pátého řádku v tabulce (OFFSET 4 ROWS
):
Řešení 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Zde je výsledek dotazu:
name | cena |
---|---|
Robot Tobie | 185,50 |
Na kole BMX | 200,00 |
Všimněte si, že tento dotaz vrací pouze dva řádky, nikoli uvedených pět. Podívejte se na obrázek:
Proč jen dvě řady? Protože tato tabulka obsahuje pouze šest záznamů. Pokud vynecháme první čtyři řady a začneme na řadě 5, zbývají pouze dvě řady.
SQL Server má další způsob, jak omezit řádky:klauzuli TOP.
Řešení 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Zde je výsledek dotazu:
name | cena |
---|---|
Easy Bricks | 21:00 |
Hra s rybařením | 25,00 |
Hádanky se zvířaty | 45,80 |
Pokud nepotřebujete vynechávat žádné řádky, můžete použít klauzuli TOP serveru SQL Server k omezení vrácených řádků. Je umístěn bezprostředně za SELECT. Za klíčovým slovem TOP následuje celé číslo udávající počet řádků, které se mají vrátit. V našem příkladu jsme objednávali podle ceny a poté omezil vrácené řádky na 3.
Na rozdíl od metody OFFSET – FETCH, TOP nevyžaduje ORDER BY. Zde je podobný příklad, ale bez řazení záznamů:
Řešení 4:
SELECT TOP 3 name, price FROM toy;
Zde je výsledek dotazu:
Všimněte si, že byly vráceny různé záznamy. Obvykle (ale ne vždy) se řádky zobrazí v pořadí, v jakém byly záznamy vloženy do tabulky.
Doporučujeme používat OFFSET a FETCH místo TOP, protože OFFSET a FETCH jsou standardem SQL; TOP je specifický pro T-SQL.