Как вывести первые 100 строк sql

Как в SQL получить первые (или последние) строки запроса? TOP или OFFSET?

Всем привет, сегодня мы поговорим о том, как в Microsoft SQL Server на языке T-SQL можно оставить только определенное количество первых строк результирующего набора данных. При этом мы рассмотрим два способа реализации этой простой задачи. Также я покажу Вам, как можно вывести, наоборот, только последние строки SQL запроса.

В языке T-SQL существует две стандартные возможности, которые позволяют нам применить фильтр к результирующему набору данных, иными словами, оставить в результате только определённое количество строк. Это могут быть первые строки, с учётом сортировки, что достаточно часто требуется при работе с базами данных на SQL, или последние строки, а также существует возможность вывести любой набор строк, например, пропустить первые строки и вывести определённое количество следующих строк.

Как я уже отметил, существует два способа фильтрации результирующего набора данных, первый – это использование фильтра TOP, и второй – это использование конструкции OFFSET-FETCH, которую мы подробно рассмотрели в отдельном материале — «OFFSET-FETCH в T-SQL – описание и примеры использования».

Получаем первые строки результата SQL запроса

Сейчас давайте я покажу, как можно вывести первые строки результирующего набора данных, сначала мы рассмотрим пример с использованием TOP, а затем сделаем то же самое только с помощью OFFSET-FETCH.

Читайте также:  Чем отбелить детские вещи дома

Но для начала давайте определимся с исходными данными, чтобы Вы понимали, какие данные у нас есть и что мы получаем в итоге.

Исходные данные для примеров

В качестве сервера у меня выступает Microsoft SQL Server 2016 Express. А теперь давайте представим, что у нас есть таблица TestTable и в ней содержатся следующие данные (перечень товаров с указанием цены).

Получаем первые строки запроса с помощью TOP

TOP – это инструкция T-SQL, с помощью которой можно ограничить число строк в результирующем наборе данных SQL запроса.

Синтаксис

TOP (Число строк) [PERCENT]

У инструкции TOP несколько параметров:

  • Число строк – сразу после ключевого слова TOP в скобочках мы указываем число, которое будет означать количество строк в итоговом результате. В инструкции SELECT допускается указание данного числа без скобочек, однако это не рекомендуется;
  • PERCENT – параметр, который говорит, что в запросе необходимо оставить не фактическое количество строк, а процент строк от общего количества, т.е. число, указанное ранее, будет означать процент, а не количество;
  • WITH TIES – параметр, который говорит, что в результирующий набор необходимо включить и записи с тем же значением, что и последняя строка, в случае наличия подобных записей. Например, если Вам нужно получить 5 самых дорогих товаров, при этом на пятом месте запись с ценой 100, а на шестом месте также цена 100, так вот, без параметра WITH TIES Вам вернётся 5 строк, а если данный параметр указать — вернется 6 строк.

Фильтр TOP обычно применяется с сортировкой данных (ORDER BY), однако это необязательно, можно применять данный фильтр и без сортировки данных, только в этом случае строки будут возвращаться в произвольном порядке (так, как они хранятся).

Пример SQL запроса с TOP – выводим первые 5 строк

Допустим, нам нужно получить 5 самых дорогих товаров, для этого пишем следующий запрос.

В данном случае мы указали сортировку по уменьшению цены (ORDER BY Price DESC), а также применили фильтр TOP (5), для ограничения вывода строк результирующего набора.

Пример SQL запроса с TOP и параметром WITH TIES

Сейчас давайте запустим два запроса, в обоих случаях мы будем запрашивать 4 самых дорогих товара, т.е. применим фильтр TOP (4), однако во втором запросе дополнительно мы укажем параметр WITH TIES и посмотрим на разницу итогового результата.

В итоге мы очень хорошо видим разницу, в первом случае вывелось 4 строки, а во втором 5, так как товар в 5 строке имеет точно такую же цену, как и товар в 4 строке.

Пример SQL запроса с TOP и параметром PERCENT

В этом примере давайте просто выведем 50 процентов итогового набора записей, т.е. половину. Для этого мы используем параметр PERCENT.

Так как у нас в таблице TestTable всего 8 записей, нам вывелось 4 строки, т.е. как раз 50 процентов.

Получаем первые строки запроса с помощью OFFSET-FETCH

Вторым способом получения первых строк является использование конструкции OFFSET-FETCH, однако она появилась только в 2012 версии SQL сервер, до этого, соответственно, этот способ использовать не получится.

У конструкции OFFSET-FETCH отсутствуют такие параметры, как PERCENT и WITH TIES, которые есть у фильтра TOP, однако у OFFSET-FETCH есть одно очень важное преимущество – это возможность пропускать определенное количество первых строк.

Примечание! OFFSET-FETCH — это часть конструкции ORDER BY, поэтому без сортировки использовать OFFSET-FETCH не удастся. Также не получится одновременно использовать OFFSET-FETCH и TOP в одном запросе SELECT.

Пример SQL запроса с OFFSET-FETCH — выводим первые 5 строк

Чтобы вывести первые строки с помощью конструкции OFFSET-FETCH, нам нужно в секции OFFSET указать 0, т.е. начинать вывод сразу с первой строки (если указать другое число, то именно такое количество строк будет пропущено). В секции FETCH мы соответственно указываем 5.

Результат, мы видим, точно такой же, как и в случае с TOP.

Как вывести последние строки SQL запроса?

Если Вам нужно получить не первые строки результирующего набора данных, а последние (например, последние записи в таблице), причем с той же самой сортировкой, то Вы также можете использовать два способа, т.е. и TOP, и OFFSET. В обоих случаях нам нужно будет немного усложнить запросы.

Получаем последние строки SQL запроса с помощью TOP

В случае с TOP нам дополнительно потребуется использовать конструкцию WITH (CTE – обобщенное табличное выражение), для того чтобы выполнить сортировку по идентификатору для применения фильтра TOP, т.е. отобрать самые последние записи. А после этого мы уже можем отсортировать строки так, как нам нужно.

Как видите, нам вывелись 5 последних строк.

Получаем последние строки SQL запроса с помощью OFFSET-FETCH

Для получения последних строк с помощью OFFSET-FETCH нам потребуется предварительно узнать общее количество строк, для того чтобы определить, сколько строк нужно пропустить. Это можно сделать как с помощью вложенного запроса, так и с помощью предварительного сохранения нужного нам значения в переменной. Я покажу способ с использованием переменной.

Итоговый результат такой же, как и в запросе с TOP.

Теперь Вы знаете, как с помощью TOP и OFFSET получать первые и последние строки результирующего набора данных, который возвращает SQL запрос.

В данной статье мы затронули одну очень маленькую возможность языка T-SQL, но их, как Вы понимаете, гораздо больше, поэтому, если Вы начинающий программист и хотите изучить язык T-SQL, то рекомендую посмотреть мои видеокурсы по T-SQL, с помощью которых Вы «с нуля» научитесь работать с SQL и программировать на T-SQL.

У меня на этом все, удачи в освоении языка T-SQL!

Источник

Как вывести первые 100 строк sql

Здраствуйте!
Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

От: Dimka
Дата: 02.09.03 07:44
Оценка: 4 (2)

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>Заранее спасибо.

зависит от того, какая база данных

— вывести с 0 по 100

в оракле там поизвращённее

От: ShAlexNik
Дата: 02.09.03 07:49
Оценка: 3 (1)

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>Заранее спасибо.

Решение заключено в ответе на вопрос: «Есть ли способ у используемого Вами SQL сервера пронумеровать строки
возвращаемого набора в том же SELECT’е?»

Если есть, то проблема решается путем соответствующего условия в директиве WHERE.

Если нет, как например в MS SQL Server, то можно сождать UDF, которая с помощью переменной-таблицы, повторяющей
набор атрибутов Вашего запроса + поле типа IDENTITY(1,1), выполнит нумерацию. Далее Вы просто используете ее в
запросе с соответствующими условиями в директиве WHERE.

От: FIR
Дата: 02.09.03 08:37
Оценка:

Здравствуйте, Dimka, Вы писали:

D>В MySQL
D>
D> — вывести с 0 по 100

Спасибо, а где указывать этот limit — Я работаю в «Disign View» SQLServer’а — чего-то куда не поставлю — ругается на синтаксис.

От: Dimka
Дата: 02.09.03 09:00
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Здравствуйте, Dimka, Вы писали:

D>>В MySQL
D>>
D>> — вывести с 0 по 100

FIR>Спасибо, а где указывать этот limit — Я работаю в «Disign View» SQLServer’а — чего-то куда не поставлю — ругается на синтаксис.

мда. ну я говорил про MySQL про SQLServer к сожалению ничего не знаю

От: playnext
Дата: 02.09.03 11:14
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>Заранее спасибо.

От: playnext
Дата: 02.09.03 11:34
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>Заранее спасибо.
В MS SQL можно также

От: Oxy
Дата: 02.09.03 11:39
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

Не знаю насчет вторых пяти, третих пяти и т.д., но первые пять запросто

От: FIR
Дата: 02.09.03 11:45
Оценка:

Здравствуйте, Oxy, Вы писали:

Oxy>

Ну это-то я знаю.

От: Аноним
Дата: 02.09.03 12:10
Оценка:
От: grs
Дата: 02.09.03 13:05
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>Заранее спасибо.

А в Transact-SQL’е для этих целей можно пользоваться курсорами. Вот пример из документации:

The following steps show how to use a cursor with the above query:
1.Declare the cursor.
This declare cursor statement defines a cursor using the select statement shown above:
declare newauthors_crsr cursor for

select author = au_fname + » » + au_lname, au_id
from authors
for update

2.Open the cursor:
open newauthors_crsr

3.Fetch rows using the cursor:

fetch newauthors_crsr
author au_id

You can fetch more than one row at a time by specifying the number of rows with the set command:

set cursor rows 5 for newauthors_crsr
go

author au_id
————————- ————
Marjorie Green 213-46-8915
Cheryl Carson 238-95-7766
Michael O’Leary 267-41-2394
Dick Straight 274-80-9391
Meander Smith 341-22-1782

(5 rows affected)

Each subsequent fetch brings back five more rows:

author au_id
————————- ————
Abraham Bennet 409-56-7008
Ann Dull 427-17-2319
Burt Gringlesby 472-27-2349
Chastity Locksley 486-29-1786
Morningstar Greene 527-72-3246
(5 rows affected)

The cursor is now positioned at author Morningstar Greene, the last row of the current fetch.

4.Perform the following update for Ms. Greene, who has become weary of New Age jokes about her name:

update authors
set au_fname = «Voilet»
where current of newauthors_crsr

The cursor remains at Ms. Greene’s record until the next fetch.

5.Once you are finished with the cursor, you can close it:

Closing the cursor releases the result set, but the cursor is still defined. If you open the cursor again, Adaptive Server reruns the query and places the cursor before the first row in the result set. The cursor is still set to return five rows with each fetch.

6.Use the deallocate command to make the cursor undefined:

deallocate cursor newauthors_crsr

You cannot reuse the cursor name until you deallocate it.

От: ZORK www.zorkaltsev.com
Дата: 02.09.03 15:35
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Спасибо, а где указывать этот limit — Я работаю в «Disign View» SQLServer’а — чего-то куда не поставлю — ругается на синтаксис.

То что он ругается, говорит только о том, что это нельзя редактировать визуально . но при этом sql выражение может и работать. У визуального редактора есть довольно много ограничений — он, например, не может редактировать выражение содеражащие union’ы

От: AngelOKES
Дата: 09.09.03 09:57
Оценка:

Здравствуйте, FIR, Вы писали:

FIR>Здраствуйте!
FIR>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>Заранее спасибо.

select * from table top 100

От: FIR
Дата: 09.09.03 10:43
Оценка:

Здравствуйте, AngelOKES, Вы писали:

AOK>select * from table top 100

Очень хорошо, это с первой по сотую, а с 15-ой по 25-ую записи как.

Если Вы обратили внимание — то ответ аналогичный Вашему уже был!

От: Alex Warm
Дата: 10.09.03 04:24
Оценка: 3 (1)

Здравствуйте, FIR, Вы писали:

AOK>>select * from table top 100
FIR>Очень хорошо, это с первой по сотую, а с 15-ой по 25-ую записи как.
FIR>Если Вы обратили внимание — то ответ аналогичный Вашему уже был!

От: star0ff
Дата: 02.06.04 04:55
Оценка:

Здравствуйте, AngelOKES, Вы писали:

AOK>Здравствуйте, FIR, Вы писали:

FIR>>Здраствуйте!
FIR>>Совственно вопрос в теме сообщения — Допустим SELECT со всеми необходимым условиями WHERE отбирает около 100 записей.
FIR>>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

FIR>>Заранее спасибо.

AOK>select * from table top 100

ну а если в Оракле, то select * from table rownum >

От: Dimka
Дата: 02.06.04 08:54
Оценка:

Здравствуйте, star0ff, Вы писали:
FIR>>>Можно ли, и если можно, то как, указать, Что бы он возвращал спачала первые пять записей, потом вторые пять, потом третью пятёрку записей.

AOK>>select * from table top 100

S>ну а если в Оракле, то select * from table rownum

ага, но только если нет сортировки

От: Gregory_krovosos
Дата: 02.06.04 09:50
Оценка:

Здравствуйте, Dimka, Вы писали:

D>Здравствуйте, FIR, Вы писали:

FIR>>Здравствуйте, Dimka, Вы писали:

D>>>В MySQL
D>>>
D>>> — вывести с 0 по 100

FIR>>Спасибо, а где указывать этот limit — Я работаю в «Disign View» SQLServer’а — чего-то куда не поставлю — ругается на синтаксис.

D>мда. ну я говорил про MySQL про SQLServer к сожалению ничего не знаю

На MS SQL Server:

select top 100 * from table

От: Merle http://rsdn.ru
Дата: 02.06.04 10:02
Оценка:

Здравствуйте, star0ff, Вы писали:

S>ну а если в Оракле, то select * from table rownum
Ну что вы как дети малые.
Мало того, что подняли топик годовалой давности и давай писать, так еще и пишите не правильно.
Любое ограничение вывода без сортировки смысла не имеет, потому как БД не гарантирует соблюдение порядка хранения записей.

Источник

Оцените статью