Оператор SQL: TOP. — it-black.ru
Оператор SQL: TOP. — it-black.ruОператор TOP позволяет ограничить выборку числа записей до заданного числа. При использовании оператора TOP совместно с оператором ORDER BY, на вывод пойдет первые N записей отсортированного списка, в противном случае, выведутся первые N строк таблицы.
Данный оператор используется только в СУБД MS SQL Server. Аналогом в MySQL является оператор LIMIT.
// Синтаксис оператора TOP: TOP ( N [PERCENT] ) // Параметр PERCENT позволяет задать количество строк в процентах.
Примеры оператора TOP. Возьмём нашу таблица Artists:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | 2300000 |
The Prodigy | Fat of the Land | 1997 | 600000 |
The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
Massive Attack | 100th Window | 2003 | 1200000 |
Drowning Pool | Full Circle | 2007 | 800000 |
Massive Attack | Danny The Dog | 2004 | 1900000 |
Drowning Pool | Resilience | 2013 | 500000 |
Пример 1. Используя оператор TOP вывести 3 самых свежих альбома (название и год выпуска):
SELECT TOP(3) Album, Year FROM Artists ORDER BY Year;
Результат:
Album | Year |
Resilience | 2013 |
Invaders Must Die | 2008 |
Full Circle | 2007 |
Пример 2. Используя оператор TOP вывести первые 2 строки таблицы:
SELECT TOP(2) * FROM Artists;
Результат:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Поделиться в facebook
Поделиться в twitter
Поделиться в vk
VK
Поделиться в google
Google+
Группа в VK
Помощь проекту
Обнаружили опечатку?
Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!
Свежие статьи
Облако меток
Instagram Vk Youtube Telegram Odnoklassniki
Полезно знать
Рубрики
Авторы
© it-black.
ru | 2016 — 2022сервер sql — выберите верхний 1 * vs выберите верхний 1 1
спросил
Изменено 7 лет, 1 месяц назад
Просмотрено 35 тысяч раз
Я знаю, что таких вопросов много, но я не могу найти ни одного, относящегося к моему вопросу.
Глядя на этот вопрос, имеет ли изменение IF EXIST (SELECT 1 FROM ) на IF EXIST (SELECT TOP 1 FROM) какие-либо побочные эффекты?
Специально ссылаясь на этот раздел в ответе:
выберите * из sys.objects выберите верхний 1 * из sys.objects выберите 1, где существует (выберите * из sys.objects) выберите 1, где существует (выберите верхний 1 * из sys.objects)
Я провожу несколько собственных тестов, чтобы правильно понять это. Как указано в ответе:
выберите 1, где существует (выберите верхний 1 * из sys.objects) выберите 1, где существует (выберите верхний 1 1 из sys.objects)
оба вызывают один и тот же план выполнения, а также вызывают тот же план, что и
выберите 1, где существует (выберите * из sys.objects) выберите 1, где существует (выберите 1 из sys.objects)
Из моего исследования таких вопросов, как этот, «ВЫБЕРИТЕ ВЕРХНИЙ 1 1» VS «ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1»). объекты)
Мой первый вопрос: почему это предпочтительнее этого:
выберите 1, где существует (выберите 1 из sys.objects)
Пытаясь понять это, я разбил их на более простые выражения (я использую «top 1», чтобы имитировать план выполнения, напоминающий существующий):
выбрать верхний 1 * из sys.objects выберите верхний 1 1 из sys.objects
Теперь я вижу, что первое занимает 80% времени выполнения (относительно пакета из 2), а второе — только 20%. Тогда не лучше ли использовать
select 1, где существует (выберите 1 из sys. objects)
, как его можно применить к обоим сценариям и тем самым уменьшить возможную человеческую ошибку?
- sql-сервер
- tsql
- производительность базы данных
2
SQL Server обнаруживает предикат EXISTS
относительно рано в процессе компиляции/оптимизации запроса и устраняет фактический поиск данных для таких предложений, заменяя их проверкой существования. Итак, ваше предположение:
Теперь я вижу, что первое занимает 80% времени выполнения (относительно пакета из 2), а второе — только 20%.
неверно, потому что в предыдущем сравнении вы фактически извлекли некоторые данные, чего не происходит, если запрос помещается в (не)существует
предикат.
В большинстве случаев нет никакой разницы, как проверять наличие строк, за исключением одного, но важного улова. Предположим, вы говорите:
, если существует (выберите * из dbo.SomeTable) ...
где-то в модуле кода (представление, хранимая процедура, функция и т. д.). Затем, позже, когда кто-то еще решит поместить предложение WITH SCHEMABINDING
в этот модуль кода, SQL Server не допустит этого и вместо возможной привязки к текущему списку столбцов выдаст ошибку:
Сообщение 1054, уровень 15, состояние 7, процедура BoundView, строка 6
Синтаксис ‘*’ не допускается в объектах, привязанных к схеме.
Итак, вкратце:
, если существует (выберите 0 из ...)
— это самый безопасный, быстрый и универсальный способ проверки существования.
2
Разница между этими двумя:
select top 1 * from sys.objects выберите верхний 1 1 из sys.objects
Дело в том, что в первом предложении SQL-сервер должен извлекать все столбцы из таблицы (из любой случайной строки), а во втором просто можно извлекать «1» из любого индекса.
Все меняется, когда эти предложения находятся внутри . Существует предложение
, потому что в этом случае SQL Server знает, что на самом деле ему не нужно извлекать данные, потому что они не будут ни к чему присваиваться, поэтому он может обрабатывать select *
the точно так же он будет обрабатывать select 1
.
Поскольку exists проверяет только одну строку, в нее встроена внутренняя вершина 1, поэтому добавление ее вручную ничего не меняет.
Погода для выбора *
или выбора 1
в предложении exists просто основано на мнении, и вместо 1 у вас, конечно, может быть 2 или «X» или что-то еще, что вам нравится. Лично я всегда использую ... и существует (выберите 1 ...
EXISTS — это тип подзапроса, который может возвращать логическое значение только в зависимости от того, возвращаются ли подзапросом какие-либо строки. Выбор 1 или * или что-то еще не имеет значения в этом контексте, потому что результат всегда либо истина, либо ложь.
Вы можете убедиться в этом, проверив, что эти два оператора создают один и тот же план.
выберите 1, где существует (выберите * из sys.objects) выберите 1, где существует (выберите 1 из sys.objects)
То, что вы выбираете во внешнем запросе, имеет значение. Как вы обнаружили, эти два оператора создают очень разные планы выполнения:
select top 1 * from sys.objects выберите верхний 1 1 из sys.objects
Первый будет медленнее, потому что он должен фактически возвращать реальные данные. В этом случае соединение с тремя базовыми таблицами: syspalnames, syssingleobjrefs и sysschobjs.
Что касается того, что вы помещаете в свои подзапросы EXISTS — SELECT 1 или SELECT * — это не имеет значения. Обычно я говорю SELECT 1, но SELECT * так же хорош, и вы увидите его во многих документах Microsoft.
Я искал ответ на как раз собственно вопрос, содержащийся в заголовке. Я нашел его по этой ссылке:
Select Top 1 или Top n в основном возвращает первые n строк данных на основе по sql-запросу. Выберите Top 1 1 или Top n s вернет первый n строки с данными в зависимости от запроса sql.
Например, приведенный ниже запрос выдает имя и фамилию первые 10 матчей. Этот запрос вернет имя и фамилию Только.
ВЫБЕРИТЕ ПЕРВЫЕ 10 Имя, Фамилия ОТ [tblUser] где адрес электронной почты, например, «Джон%»Теперь посмотрите на этот запрос, выбрав 10 лучших «тестов» — это даст то же количество строк, что и в предыдущем запросе (та же база данных, тот же условие), но значения будут «тестовыми».
ВЫБЕРИТЕ ПЕРВЫЕ 10 «тест» ОТ [tblUser] где адрес электронной почты, например, «Джон%»
Итак, select TOP 1 *
возвращает первую строку, а select TOP 1 1
возвращает одну строку , содержащую только «1». Это если запрос возвращает хотя бы одну строку, иначе Null
будет возвращено в обоих случаях.
В качестве дополнительного примера:
SELECT TOP 10 'test', FirstName ОТ [tblUser] где адрес электронной почты, например, «Джон%»
вернет таблицу, содержащую столбец, заполненный «тестом», и другой столбец, заполненный первыми именами первых 10 совпадений запроса.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Обязательно, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Запрос— Странное поведение предложения TOP 1 sql server
Задавать вопрос
спросил
Изменено 1 год, 6 месяцев назад
Просмотрено 109 раз
У меня есть база данных SQL Server, и я восстановил ее на другом сервере на другой машине. Теперь я запускаю один и тот же запрос в обеих БД, который дает такой же набор результатов ниже.
выберите person_id, visit_id, проверочный_код, номер мобильного телефона, created_date от человека заказ по коду_верификации, дате создания DESC
Но когда я добавляю предложение TOP 1 к приведенному выше запросу, исходная БД показывает 2-ю строку (игнорирует первую строку)
выбирает TOP 1 person_id, visit_id, Verification_code, mobileNo, created_date от человека заказ по коду_верификации, дате создания DESC
в то время как восстановленная БД показывает первую строку
Я думал, что это может быть из-за разной сортировки, но я проверил, что оба сервера имеют одинаковую сортировку.
- sql-сервер
- запрос
- под заказ
- комплектация
- верх
3
Майк Д. предоставил ответ о том, как SQL Server сортирует данные, которые могут помочь вам понять, что это за детерминированный результат , который вы видите в некоторых комментариях.