sql >> Databáze >  >> RDS >> Sqlserver

Jak omezit řádky v sadě výsledků serveru SQL Server

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.


  1. Může datový typ Postgres NUMERIC ukládat podepsané hodnoty?

  2. Zkrat Oracle CASE nefunguje ve skupině

  3. Jak získat záznamy za posledních 30 minut v MS SQL?

  4. Který SQL dotaz je lepší, MATCH AGAINST nebo LIKE?