Проблем:
Искате да ограничите редовете в набора от резултати на SQL Server.
Пример:
Нашата база данни има таблица с име toy
с данни в колоните id
, name
и price
.
id | име | цена |
---|---|---|
161 | Велосипед BMX | 200,00 |
121 | Роботът Тоби | 185,50 |
213 | Игра за риболов | 25,00 |
102 | Пъзели с животни | 45,80 |
111 | Комплект състезателни писти | 126,70 |
233 | Лесни тухли | 21.00 |
Нека изберем имената и цените на играчките. Но трябва да видим само първите пет реда.
Решение 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Ето резултата от заявката:
name | цена |
---|---|
Лесни тухли | 21.00 |
Игра за риболов | 25,00 |
Пъзели с животни | 45,80 |
Комплект състезателни писти | 126,70 |
Роботът Тоби | 185,50 |
Дискусия:
За да ограничите редовете в резултатния набор, използвайте ORDER BY с незадължителните клаузи OFFSET и FETCH. Първо, заявката сортира редовете (ORDER BY). След това казвате на SQL Server кой трябва да бъде първият ред в резултантния набор (OFFSET...ROWS) и колко реда да върне (FETCH...ONLY).
Клаузата OFFSET се поставя непосредствено след ORDER BY. Цялото число показва първия ред за броене (в SQL Server първият ред е 0, вторият ред е 1 и т.н.), последван от ключовата дума ROW или ROWS. Можете да използвате ROW или ROWS, но се препоръчва да използвате ROW за 1 ред и ROWS за 0 и няколко реда. Вижте снимката:
В нашия пример ние сортираме по цена (ORDER BY price
) и започнете да връщате резултати от първия ред (OFFSET 0 ROWS
). След това използваме FETCH с ключовата дума FIRST. Можете да използвате FIRST или NEXT; препоръчително е да използвате FIRST, ако започвате от първия ред, без да пропускате никакви записи, и NEXT, ако някои редове са пропуснати (т.е. ако OFFSET е по-голямо от 0).
И накрая, имаме броя на редовете за избор и ключовата дума САМО РЕДОВЕ. Използвайте САМО РЕДОВЕ, ако връщате няколко реда и САМО РЕД ограничавате резултата до един ред. В нашия пример го ограничаваме до пет реда (FETCH FIRST 5 ROWS ONLY
).
По-долу имаме друга заявка, която ограничава редовете до пет, но започва от петия ред в таблицата (OFFSET 4 ROWS
):
Решение 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Ето резултата от заявката:
name | цена |
---|---|
Роботът Тоби | 185,50 |
Велосипед BMX | 200,00 |
Забележете, че тази заявка връща само два реда, а не посочените пет. Вижте снимката:
Защо само два реда? Тъй като тази таблица съдържа само шест записа. Ако пропуснем първите четири реда и започнем от ред 5, остават само два реда.
SQL Server има друг начин за ограничаване на редовете:клаузата TOP.
Решение 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Ето резултата от заявката:
name | цена |
---|---|
Лесни тухли | 21.00 |
Игра за риболов | 25,00 |
Пъзели с животни | 45,80 |
Ако не е необходимо да пропускате редове, можете да използвате клаузата TOP на SQL Server, за да ограничите върнатите редове. Поставя се веднага след SELECT. Ключовата дума TOP е последвана от цяло число, което показва броя на редовете, които трябва да се върнат. В нашия пример подредихме по цена и след това ограничи върнатите редове до 3.
За разлика от метода OFFSET – FETCH, TOP не изисква ORDER BY. Ето подобен пример, но без сортиране на записите:
Решение 4:
SELECT TOP 3 name, price FROM toy;
Ето резултата от заявката:
Забележете, че са върнати различни записи. Обикновено (но не винаги) редовете ще се показват в реда, в който записите са били вмъкнати в таблицата.
Препоръчваме да използвате OFFSET и FETCH вместо TOP, тъй като OFFSET и FETCH са SQL стандарт; TOP е специфичен за T-SQL.