Запрос SQL для сортировки результата выборки
Вы здесь: Главная — MySQL — SQL — Запрос SQL для сортировки результата выборки
Очень часто требуется не просто сделать выборку записей из таблицы, но и сразу отсортировать по какому-либо полю. Например, отсортировать зарегистрированных пользователей по дате регистрации. И вот для решения таких задач в этой статье мы рассмотрим SQL-запрос для сортировки результата выборки.
Давайте не буду Вас мучать, а сразу дам SQL-запрос на сортировку результата выборки:
SELECT * FROM users ORDER BY date_registration
В результате мы получим result_set, в котором записи отсортированы по возрастанию поля «date_registration«. Чтобы данные сортировались по убыванию, нужно использовать параметр «DESC«:
SELECT * FROM users ORDER BY date_registration DESC
Результат тот же, что и в предыщем запросе, но данные расположены по убыванию относительно поля «
Разумеется, никто Вам не мешает использовать полноценный SQL-запрос на выборку записей с сортировкой:
SELECT login FROM users WHERE id > 20 AND id < 100 ORDER BY login LIMIT 10,30
После выполнения этого SQL-запроса у нас получится result_set, в котором содержатся записи из таблицы users (только поле «login«), причём id этих записей больше 20 и меньше 100, сортировка записей по возрастанию поля «login«, а берём мы записи, начиная с 10-ой включительно в количестве 30-ти штук.
Вновь ничего сложного. Единственная проблема: «Как это всё запомнить?«. Ответ прост: практика, практика и ещё раз практика! А если забудете всегда есть справочник или PHPMyAdmin
, в котором можно легко узнать SQL-запрос на любое действие.Полный курс по PHP и MySQL: http://srs.myrusakov.ru/php
- Создано 19.01. 2011 18:17:22
- Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
<a href=»https://myrusakov. ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>Она выглядит вот так:
-
Текстовая ссылка:
<a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
[URL=»https://myrusakov.ru»]Как создать свой сайт[/URL]
Сортировка данных по убыванию и возрастанию — learn-office
Предположим, что мы подготовили отчет по продажам и финансовым результатам по каналам продаж и менеджерам следующего вида:
Глаза разбегаются, правда? Для того, чтобы было легче читать эту таблицу, определимся с тем, какая информация для нас существенна, а какая нет.
Будем считать, что в данный момент нас интересует только выручка и полученная прибыль. Причем мы хотим отсортировать клиентов по убыванию этих показателей, чтобы оценить эффективность работы.
Сразу отметим 2 важных момента.
1. Как правило, таблицы такого рода создаются с помощью формул. До проведения сортировки нужно обязательно убрать все формулы из всех ячеек, иначе провести операцию просто не удастся, а если и удастся, то все значения изменятся, т.к. формулы будут ссылаться на совершенно другие ячейки, чем должны.
2. Если в дальнейшем нам понадобится убрать сортировку и вернуться к прежнему виду таблицы, следует позаботиться об этом на данном этапе. Пронумеруем строки первоначальной таблицы на случай, если захотим вернуться к ней, и тогда у нас будет возможность отсортировать строки по нумерации.
Как убрать формулы из всех ячеек листа
Для того, чтобы одновременно убрать все формулы нужно:
1. Выделить всю область листа, для чего необходимо нажать левой клавишей мыши на самый верхний левый угол серого поля:
2. Скопировать выделенную область (не снимая выделения области, правой кнопкой мыши вызываем меню и выбираем «Копировать»)
3. Воспользоваться специальной вставкой (не снимая выделения области, правой кнопкой мыши вызываем меню и выбираем «Специальная вставка» -> «значения»)
Ну, а теперь можно удалить или скрыть лишние столбцы, не боясь изменения отчета.
Прежде чем приступить непосредственно к сортировке, нужно проверить, чтобы сортируемая таблица не содержала объединенных ячеек в шапке или другом месте. В таком случае Excel будет ругаться и писать: «Для этого требуется, чтобы ячейки имели одинаковый размер».
Если Вы не намерены снимать объединение ячеек шапки и менять таблицу, можно перенести сортируемый столбик в левый крайний ряд и отсортировать его с помощью кнопочек сортировки.
Например, мы хотим отсортировать таблицу по убыванию выручки. Выделяем сортируемые строки по серому полю без шапки и нажимаем на «Сортировку по убыванию»:
ВНИМАНИЕ: Это касается только объединенных ячеек в шапке. Если внутри таблицы есть объединенные ячейки, Excel не будет сортировать такие строки. Придется снимать объединение.
Если же таблица не содержит объединенных ячеек, можно провести сортировку непосредственно внутри таблицы без переноса сортируемого столбца.
Для этого выделяем всю область таблицы вместе с шапкой, находим в главном меню «Данные» и выбираем «Сортировку»:
В выпавшем окне Excel предложит сделать сортировку по всем показателям, перечисленным в шапке. Мы выберем «Чистую прибыль»:
С помощью полученного рейтинга мы наглядно сможем видеть, какие менеджеры и клиенты приносят компании больше прибыли.
Если же мы совместим данный вид сортировки с сортировкой через автофильтр, мы сможем отсортировать данные по отделам, менеджерам и клиентам. Добавим столбец для сортировки и отсортируем данные по менеджерам:
Как видим, в результате у нас получился удобный отчет, который очень наглядно демонстрирует, кто из менеджеров приносит больше всего прибыли, а кто работает с нерентабельными клиентами.
Сортировка возвращаемого результата
Результат может быть гораздо более полезным если добавить возможность упорядочивания или сортировки информации. Информация может сортироваться по алфавиту, по численному порядку, хронологическому порядку, в режиме по возрастанию или убыванию. Более того данные можно отсортировать используя комбинацию столбцов и можно использовать столбцы которые не возвращаются запросом. Сортировка результата обычно происходи после того как результат команды SELECT готов. Параметры сортировки не влияют на данные в результате, они влияют лишь на то как результат отобразится. Одни и теже строки могут быть получены как в результате запроса с сортировкой, так и в результате запроса без сортировки. Сортировка результата обеспечивается предикатом ORDER BY
Предикат ORDER BY
Предикат ORDER BY всегда находится в конце команды SELECT. Полный синтаксис команды SELECT будет изменяться по мере изучения возможностей команды, но ни одна директива не может быть после ORDER BY.
SELECT *|{[DISTINCT] column|expression [alias],…}
FROM table
[WHERE condition(s)]
[ORDER BY {col(s)|expr|numeric_pos} [ASC|DESC] [NULLS FIRST|LAST]];
Сортировка по возрастанию или убыванию
Сортировка по возрастанию более естественна для большинства типов данных и поэтому используется по умолчанию в команде ORDER BY. Сортировка по возрастанию для чисел значит от меньшего к большему, для даты – от более старой к более новой и символьные данные сортируются по в зависимости от позиции символа в алфавите. Первая часть предиката ORDER BY значит что результат может сортироваться по одному или нескольким столбцам или выражениям
ORDER BT col(s)|expr
Предположим что нам нужен отчёт в котором должны быть указаны фамилия сотрудника, дата приёма на работу и зарплата. Данные должны быть отсортированы по алфавиту и включать только торговых представителей и менеджеров по маркетингу.
Такой запрос можно получить выполнив
select last_name, hire_date, salary from employees
where job_id in (‘SA_REP’,’MK_MAN’)
order by last_name desc nulls last;
Выбранные данные можно сортировать используя любые столбцы таблицы в секции FROM, включая столбцы которые не перечислены в списке SELECT. Добавляя ключевое слово DESC к столбцу или выражению в секции ORDER BY строки сортируются по убыванию. Параметр NULLS LAST указывает, что если в строках результата присутствуют значения NULL то строки со значением NULL будут отображены в конце результата, после всех других отсортированных значений. Для указания сортировки таким образом чтобы значения NULL были вначале – используется ключевое слово NULL FIRST. Также данные можно сортировать основываясь на выражениях, как показано в следующем примере
select last_name, salary, hire_date, sysdate-hire_date tenure
from employees order by tenure;
Наименьшее значение TENURE отображается первым в результате, так как ORDER BY указывает БД отсортировать результат используя псевдоним. Обратите внимание, что результат можно сортировать по выражению без псевдонима, но использование псевдонима делает запрос более читабельным.
По умолчанию используются следующие параметры ORDER BY. Самым важным является то, что если явно не задать режим DESC — предполагается сортировка по возрастанию. Если в результате есть значения NULL то по умолчанию используется NULLS LAST при сортировке ASC и NULLS FIRST при сортировке DESC. Если не указать директиву ORDER BY в запросе, то одинаковый запрос может вернуть одинаковые данные, но в разном порядке, таким образом нельзя строить предположения о порядке возвращаемых данных без указания порядка сортировки.
Сортировка по позиции
В Oracle доступен альтернативный,более короткий метод указания столбца или выражения для сортировки. Вместо указания имени столбца используется его позиция в списке SELECT. Рассмотрим пример
select last_name, hire_date, salary from employees order by 2;
В ORDER BY директиве указано число 2. Это эквивалентно указанию поля HIRE_DATE, так как второй столбец в списке SELECT является столбцом HIRE_DATE. Сортировка по позиции доступна только для столбцов которые указаны в списке столбцов команды SELECT.
Составная сортировка
Результат может быть отсортирован по нескольким столбцам используя составную сортировку. Несколько столбцов могут быть указаны (неважно по имени или по позиции) как составной ключ сортировки, путём перечисления их в секции ORDER BY через запятую. Для выборки JOB_ID, LAST_NAME, SALARY и HIRE_DATE из таблицы EMPLOYEES и сортировки данных по убыванию в зависимости от значения столбца JO_ID, затем по возрастанию по LAST_NAME и наконец по убыванию зарплаты можно выполнить запрос такого вида
select job_id, last_name, salary, hire_date from employees
where job_id in (‘SA_REP’,’MK_MAN’) order by job_id desc nulls last, last_name, 3 desc;
Сортировка в Powershell Sort-Object | FixMyPC
Для сортировки в Powershell есть командлет Sort-Object. Мы можем отсортировать любой вывод команд, в том числе массивы, хэш таблицы и по датам. Каждый вариант мы рассмотрим на примерах.
По умолчанию командлет сортирует по возрастанию (ASC). На примере ниже я получил данные по отклику процессора:
Get-Process | Sort-Object -Property CPU
Ключ Property допускает использование нескольких значений.
Если нам нужно выполнить сортировку по убыванию (DESC), то для этого есть следующий ключ:
Get-Service | Sort-Object -Descending -Property "Name"
Если у нас не указан ключ Descending, то у нас будет такая последовательность вывода:
- Числа
- Буквы английского алфавита
- Буквы русского алфавита
Сортировка массивов и дат в Powershell Sort-Object
На самом деле любой объект сортируется аналогично предыдущим примерам. Если мы собираемся выполнить в Powershell сортировку по дате нужно убедиться, что нужное свойство имеет формат Datetime.
Get-ChildItem -File | Get-Member -MemberType "Property"
Get-ChildItem -File | Sort-Object -Property "LastWriteTime"
Бывает так, что дата формата INT (численный) или STR (строковый) и если вы не хотите сортировать как числа или строки, то их нужно преобразовать. Для примера так я отсортирую по типу данных datetime преобразовав число:
Get-ADComputer -Filter * -Properties lastLogon | Sort-Object {Get-Date $_.lastLogon}
Рекомендую почитать другие примеры работы с датой в Powershell.
Пример с сортировкой массива:
$a = 'z','s','f'
$a | Sort-Object -Descending
Хэш таблцицы сортируются так же.
Дополнительные параметры сортировки в Powershell
Хоть это и мало относится к сортировке, то у нас есть возможность получить уникальные значения в выводе:
Get-Service | Sort-Object -Unique Status
Для сортировки с учетом регистра букв есть ключ CaseSensitive, но он похоже не работает ( как минимум в PS 5. 1 ).
Другие примеры использования команд можно увидеть так:
Get-Help Sort-Object -Examples
Если нужно увидеть другие ключи:
Get-Command Sort-Object -Syntax
…
Теги: #powershell
Сортировка данных в MySQL — Записки web-программиста
Для сортировки данных используется выражение ORDER BY `field_name` [ASC | DESC] [, `field_name2` [ASC | DESC]]
Существует 2 направления сортировки данных в SQL-запросе. ASC – по возрастанию и DESC – по убыванию. По-умолчанию данные сортируются по возрастанию.
Пример:
[mysql]mysql> SELECT `id` FROM `table` ORDER BY `id`;
mysql> SELECT `id` FROM `table` ORDER BY `id` ASC;[/mysql]
+----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | +----+
mysql> SELECT `id` FROM `table` ORDER BY `id` DESC;
+----+ | id | +----+ | 5 | | 4 | | 3 | | 2 | | 1 | +----+
Сортировку можно производить по нескольким полям таблицы. Причем, если указано ключевое слово DESC, упорядочивание по убыванию будет произведено по полю, которое ближе всего расположено к ключевому слову DESC.
Пример:
[mysql]mysql> SELECT `id`, `lastname`, `name` FROM `table`;[/mysql]
+----+----------+-----------+ | id | lastname | name | +----+----------+-----------+ | 1 | Иванов | Сергей | | 2 | Алексеев | Владимир | | 3 | Петров | Вячеслав | | 4 | Ампилов | Александр | | 5 | Сидоров | Тимофей | | 6 | Сидоров | Михаил | +----+----------+-----------+
[mysql]mysql> SELECT `id`, `lastname`, `name` FROM `table` ORDER BY `lastname`, `name`;[/mysql]
+----+-----------+-----------+ | id | lastname | name | +----+-----------+-----------+ | 2 | Алексеев | Владимир | | 4 | Ампилов | Александр | | 1 | Иванов | Сергей | | 3 | Петров | Вячеслав | | 6 | Сидоров | Михаил | | 5 | Сидоров | Тимофей | +----+-----------+-----------+
[mysql]mysql> SELECT `id`, `lastname`, `name` FROM `table` ORDER BY `lastname`, `name` DESC;[/mysql]
+----+-----------+-----------+ | id | lastname | name | +----+-----------+-----------+ | 2 | Алексеев | Владимир | | 4 | Ампилов | Александр | | 1 | Иванов | Сергей | | 3 | Петров | Вячеслав | | 5 | Сидоров | Тимофей | | 6 | Сидоров | Михаил | +----+-----------+-----------+
Сортировка в MySQL: несколько редко используемых возможностей
О сортировке данных с помощью SQL запросов, думаю, знают все web разработчики.
Достаточно указать в запросе предложение ORDER BY
с нужными параметрами и вы получите желаемый результат.
Параметры задавать тоже несложно. Просто перечисляете через запятую столбцы по которым нужно выполнить сортировку и указываете её направление (по возрастанию (ASC
) или по убыванию (DESC
)).
Т.е. запрос, выполняющий сортировку может выглядеть примерно следующим образом.
SELECT * FROM articles ORDER BY a_title ASC, a_date DESC
В этом случае записи из таблицы articles
будут отсортированы в возрастающем порядке по полю a_title
, а для записей у которых совпадают значения в поле a_title
– по полю a_date
в убывающем порядке.
Именно в такой форме используются возможности сортировки в большинстве случаев. Но встречаются ситуации, в которых нужно использовать более сложные правила.
Сортировка с учетом типа данных
Представьте, что у вас есть две таблицы. Первая содержит какие-нибудь записи (статьи, новости, товары и т.п.), а вторая – метаданные для этих записей. Метаданные могут содержать какую угодно информацию, например, рейтинг новости или цвет товара.
При этом таблицы будут иметь приблизительно следующую структуру.
Подобные решения используются во многих CMS, т.к. авторы не знают какие именно метаданные будет использовать разработчик сайта и предоставляют ему возможность создавать их в неограниченном количестве.
Но что произойдет если мы попытаемся выполнить сортировку по метаданным?
Такую сортировку можно выполнить с помощью следующего запроса
SELECT * FROM articles AS a LEFT JOIN metadata AS m ON a.a_id=m.m_article_id WHERE m.m_name="color"
Этот запрос выведет все записи из таблицы articles
для которых создано мета-поле color
.
Очевидно, что тип поля m_value
должен быть текстовым, т.к. заранее неизвестно что будет храниться в метаданных.
При этом числовые данные будут отсортированы не правильно. Дело в том, что ORDER BY
сравнивает значения с учетом типа поля и, например, при сортировке по возрастанию вы получите следующий ряд значений: «1», «10», «2», «3» и т.д.
Т.е. при выполнении такого запроса нужно указать, что поле m_value
необходимо считать числовым. Делается это следующим образом.
SELECT * FROM metadata ORDER BY (m_value+0)
Обратная операция (сортировка числового поля по правилам текстового) записывается немного сложнее.
SELECT left(a_id, 20) AS id_str FROM articles ORDER BY id_str
Функция left
возвращает строку, содержащую первые N
символов из строки, указанной в первом параметре. Количество символов (N) задается во втором параметре. В данном случае будут выбраны первые 20 символов (достаточно чтобы преобразовать 8-байтное целое число в строку). Т.е. движок MySQL выполнит сортировку по строке, полученной из значения числового поля.
Хочу предупредить, что несмотря на то, что данные методы могут быть удобны в ряде ситуаций, их использование приводит к снижению скорости выполнения SQL запросов. Поэтому злоупотреблять ими не стоит. С другой стороны, сортировка с помощью PHP (или любого другого языка) также займет какое-то время.
Сортировка текста с учетом регистра
Для текстовых полей сортировка выполняется без учета регистра. В большинстве случаев это правильно, т.к. в таблице символов прописная «А» идет после строчной «я». Т.е. отсортированные с учетом регистра строки будут расположены в следующем порядке.
1. «Язык запросов»
2. «Язык программирования»
3. «Язык Запросов»
Но если всё-таки сортировку нужно выполнить с учетом регистра, просто добавьте оператор BINARY
перед именем поля.
SELECT * FROM articles ORDER BY BINARY a_title
Сортировка по фрагменту строки
Если вам приходится использовать этот прием, то, скорее всего, ваша база данных не соответствует перовой нормальной форме. Поэтому, подумайте, может лучше пересмотреть её структуру?
Но, в любом случае, вы можете использовать функцию SUBSTRING_INDEX для выбора подстроки и последующей сортировки. Например,
SELECT SUBSTRING_INDEX(a_title, ' ', -1) AS at FROM wp_5_posts ORDER BY at
Сортировка записей по заданному списку значений
Представьте, что у вас есть записи, которые каким-то образом связаны с временем года. И вы храните эту информацию в одном из столбцов таблицы.
Очевидно, что, используя стандартный вариант сортировки (по алфавиту), расположить сезоны порядке «весна», «лето», «осень», «зима» не получится. Естественно, можно каждому времени года присвоить свой код, но есть и другой вариант решения – использовать функцию FIELD.
SELECT * FROM articles ORDER BY FIELD(a_season, "весна","лето","осень","зима")
Эта функция ищет значение, указанное в первом параметре, среди значений, перечисленных в остальных параметрах, и возвращает его порядковый номер. При выполнении запроса в первый параметр функции FIELD
будут передаваться значения из поля a_season
и, таким образом, записи будут отсортированы в заданном нами порядке.
Сортировка строк по их длине
Эта возможность используется довольно редко, т.к. обычно длина строки смысловой нагрузки не несет. Тем не менее, в некоторых случаях может пригодиться.
SELECT * FROM articles ORDER BY CHAR_LENGTH(a_title)
Как видите, «фокус» заключается в использовании функции CHAR_LENGTH
, которая определяет количество символов в строке.
Заключение
Думаю, глядя на последние несколько рецептов, вы понимаете, что подобным образом можно использовать практически все функции MySQL. Мне будет интересно, если вы поделитесь примерами из своей практики 😉
Интересное в Интернете
Заказ свадебных фотоальбомов с доставкой по РФ и СНГ
ПредложениеORDER BY (Microsoft Access SQL)
- 000Z» data-article-date-source=»ms.date»> 08.06.2017
- 2 минуты на чтение
В этой статье
Применимо к: Access 2013 | Доступ 2016
Сортировка результирующих записей запроса для указанного поля или полей в порядке возрастания или убывания.
Синтаксис
SELECT fieldlist FROM table WHERE selectcriteria [ORDER BY field1 [ASC | DESC] [, поле2 [ASC | DESC]] [,…]]]
Оператор SELECT, содержащий предложение ORDER BY, состоит из следующих частей:
Деталь | Описание |
---|---|
список полей | Имя поля или полей, которые должны быть извлечены вместе с любыми псевдонимами имен полей, агрегатными функциями SQL, предикатами выбора (ALL, DISTINCT, DISTINCTROW или TOP) или другими параметрами оператора SELECT. |
стол | Имя таблицы, из которой берутся записи. Для получения дополнительной информации см. Предложение FROM. |
selectcriteria | Критерии выбора. Если оператор включает предложение WHERE, ядро базы данных Microsoft Access упорядочивает значения после применения условий WHERE к записям. |
поле1 , поле2 | Имена полей, по которым сортируются записи. |
Примечания
ORDER BY не является обязательным. Однако, если вы хотите, чтобы ваши данные отображались в отсортированном порядке, вы должны использовать ORDER BY.
Порядок сортировки по умолчанию — по возрастанию (от A до Z, от 0 до 9). Оба следующих примера сортируют имена сотрудников в порядке фамилий:
ВЫБРАТЬ Фамилию, Имя
ОТ сотрудников
ЗАКАЗАТЬ ПО Фамилии;
ВЫБЕРИТЕ Фамилию, Имя
ОТ сотрудников
ЗАКАЗАТЬ ПО ФАМИЛИ ASC;
Для сортировки в порядке убывания (от Z до A, от 9 до 0) добавьте зарезервированное слово DESC в конец каждого поля, которое вы хотите отсортировать в порядке убывания. В следующем примере выбираются зарплаты и сортируются в порядке убывания:
ВЫБЕРИТЕ Фамилию, Зарплату
ОТ сотрудников
ЗАКАЗАТЬ ПО ЗАПРОСУ, УДАЛЕНИЕ ПО ФАМИЛИ;
Если вы укажете поле, содержащее данные Memo или OLE Object, в предложении ORDER BY, произойдет ошибка. Ядро базы данных Microsoft Jet не выполняет сортировку по полям этих типов.
ORDER BY обычно является последним элементом в операторе SQL.
В предложение ORDER BY можно включить дополнительные поля.Записи сортируются сначала по первому полю, указанному после ORDER BY. Записи с одинаковыми значениями в этом поле затем сортируются по значению во втором перечисленном поле и так далее.
Пример
В операторе SQL, показанном в следующем примере, используется предложение ORDER BY для сортировки записей по фамилии в порядке убывания (Z-A). Он вызывает процедуру EnumFields, которую вы можете найти в примере оператора SELECT.
Sub OrderByX ()
Dim dbs как база данных, сначала как набор записей
'Измените эту строку, чтобы включить путь к Northwind
' на твоем компьютере. Установите dbs = OpenDatabase ("Northwind.mdb")
'Выберите значения фамилии и имени из
'таблицу сотрудников и отсортируйте их по убыванию
' заказ.
Установите rst = dbs.OpenRecordset ("SELECT LastName," _
& "Имя ОТ сотрудников" _
& "ORDER BY LastName DESC;")
'Заполните набор записей.
rst.MoveLast
'Вызвать EnumFields для печати содержимого набора записей.
EnumFields первая, 12
dbs.Close
Конец подписки
Об авторах
Ссылка предоставлена сообществом UtterAccess.
UtterAccess — это ведущая вики-страница и справочный форум Microsoft Access.
См. Также
Поддержка и отзывы
Есть вопросы или отзывы об Office VBA или этой документации? См. Раздел Поддержка и отзывы Office VBA, чтобы узнать, как получить поддержку и оставить отзыв.
SQL Order by Clause Обзор и примеры
В этой статье будет рассмотрено предложение SQL ORDER BY, включая синтаксис и сценарии использования для сортировки результатов в операторе Select.
Как только мы выполняем оператор Select в SQL Server, он возвращает несортированные результаты. Мы можем определить последовательность столбца в списке столбцов оператора выбора. Нам может потребоваться отсортировать набор результатов на основе определенного значения столбца, условия и т. Д. Мы можем отсортировать результаты в порядке возрастания или убывания с помощью предложения ORDER BY в операторе Select.
Синтаксис предложения SQL Order By
Мы можем увидеть синтаксис для предложения SQL Order by следующим образом.
ВЫБРАТЬ * ИЗ имя_таблицы ORDER BY [имя_столбца] ASC | DESC |
В предложении SQL ORDER BY нам нужно определить возрастающий или убывающий порядок, в котором нужно сортировать результат.
- ASC : мы можем указать ASC , чтобы отсортировать результат в порядке возрастания
- DESC : мы можем указать DESC , чтобы отсортировать результат в порядке убывания
По умолчанию SQL Server сортирует результаты с помощью предложения ORDER BY в порядке возрастания. Указание ASC в разделе order by необязательно.
Давайте рассмотрим предложение SQL ORDER BY на примерах.
В этой статье я использую базу данных AdventureWorks2017 для всех примеров. Выполните следующий запрос в SSMS. Мы не используем предложение ORDER BY в этом запросе.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017].[HumanResources]. [Сотрудник] |
Пример 1: Сортировка результатов в столбце, определенном в операторе Select, с использованием предложения SQL Order By
Предположим, что нам нужно отсортировать результат по столбцу BirthDate. Этот столбец также указан в списке столбцов оператора Select.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017]. [HumanResources]. [Сотрудник] Упорядочить по дате рождения |
Он использует метод сортировки по умолчанию (по возрастанию), потому что мы не указали порядок сортировки в этом запросе.
Если мы хотим отсортировать результаты в порядке убывания по столбцу дата рождения , мы можем указать DESC в порядке по предложению.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017].[HumanResources]. [Сотрудник] Упорядочить по дате рождения DESC |
Пример 2: Сортировка результатов в столбце, не определенном в операторе Select, с использованием предложения SQL Order By
В предыдущем примере мы отсортировали результаты по столбцу дата рождения . Мы также указали этот столбец в списке столбцов оператора select.
Предположим, мы хотим отсортировать результаты по столбцу дня рождения, но этот столбец не указан в операторе выбора.Мы по-прежнему можем сортировать результаты по столбцу, не определенному в операторе Select.
SELECT [NationalIDNumber] , [JobTitle] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017]. [HumanResources]. [Employee]. Заказ по дате рождения DESC |
Пример 3: Сортировка результатов по позициям столбцов в операторе Select с использованием предложения SQL Order By
В предыдущих примерах мы указали имя столбца в предложении Order by для сортировки результатов в порядке возрастания или убывания.Мы также можем указать позицию столбца в предложении Order by.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017] [AdventureWorks2017]. HumanResources]. [Сотрудник] Сортировать по 3 DESC |
В этом запросе дата рождения столбца находится на 3-й позиции; поэтому мы можем использовать три в предложении Order by для сортировки результатов по данным этого столбца.
Примечание: Я бы не рекомендовал использовать позицию столбца в предложении Order By. Вы всегда должны использовать имя столбца в предложении Order by.
- Узнать имя столбца сортировки может быть неудобно. Если мы используем большой запрос, становится трудно определить позицию каждого столбца.
- Если мы вносим какие-либо изменения в список столбцов оператора Select, нам нужно изменить значение в предложении order by, чтобы отразить правильное положение столбца no
Пример 4: Сортировка результатов по нескольким столбцам в операторе Select с использованием предложения SQL Order By
Мы можем сортировать результаты на основе нескольких столбцов, а также в операторе выбора. Предположим, мы хотим получить результаты в следующем порядке.
- SickLeaveHours в порядке по возрастанию
- Отпуск в порядке убывания по убыванию
Мы можем указать как возрастающий, так и убывающий порядок в обоих столбцах, как показано в следующем запросе.
SELECT [NationalIDNumber] , SickLeaveHours , [Vacationhours] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM AdventureWorks2017].[HumanResources]. [Employee] , где MaritalStatus = ‘M’ Order by SickLeaveHours ASC, [Vacationhours] desc |
На следующем снимке экрана вы можете видеть, что результат отсортирован в порядке возрастания для SickLeaveHours . Если имеется несколько строк с одинаковым значением для SickLeaveHours , он дополнительно сортирует результаты на Vacationhours в порядке убывания.
Пример 5: Сортировка результатов по столбцам псевдонимов в операторе Select с использованием предложения SQL Order By
Часто мы определяем псевдоним столбца в операторе Select.Предположим, вы хотите получить максимальное значение в столбце с помощью функции max. Мы можем указать имя столбца, которое будет отображаться в выводе. Если мы не укажем имя столбца, мы получим вывод без имени столбца.
SELECT Max (SickLeaveHours) FROM [AdventureWorks2017]. [HumanResources]. [Employee] Где MaritalStatus = ‘M’ |
На следующем снимке экрана вы можете видеть, что мы получаем результат без имени столбца.
Давайте повторно запустим запрос, используя псевдоним.
ВЫБЕРИТЕ Max (SickLeaveHours) как MAXSickHours FROM [AdventureWorks2017]. [HumanResources]. [Сотрудник] Где MaritalStatus = ‘M’ |
Мы также можем использовать предложение Order by для столбца псевдонима. Предположим, мы хотим определить псевдоним для SickLeaveHours как [SickHours].Кроме того, мы хотим использовать этот псевдоним в предложении Order by для сортировки результатов в порядке убывания.
SELECT [NationalIDNumber] , SickLeaveHours as [SickHours] — Столбец Alias , [Vacationhours] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] ИЗ [AdventureWorks2017].[HumanResources]. [Сотрудник] Где MaritalStatus = ‘M’ Сортировать по [SickHours] DESC — Сортировать по псевдониму |
На следующем снимке экрана мы видим столбец псевдонима SickHours , отсортированный в порядке убывания.
Пример 6: Сортировка результатов с помощью выражения в инструкции Select с использованием предложения SQL Order By
Мы также можем использовать выражения в предложении Order by. Предположим, мы хотим отсортировать год в столбце даты.Давайте сначала запустим запрос без предложения Order by.
SELECT top 10 [NationalIDNumber] , SickLeaveHours as [SickHours] , [Vacationhours] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [ SalariedFlag] ИЗ [AdventureWorks2017]. [HumanResources]. [Сотрудник] Где MaritalStatus = ‘M’ |
Теперь мы хотим отсортировать столбец Дата рождения ежегодно в порядке возрастания.Я использую предложение TOP для ограничения результата вывода. Мы используем функцию DATEPART , чтобы получить указанную часть даты. В этом запросе мы хотим извлечь год для сортировки данных с помощью функции DATEPART .
SELECT top 10 [NationalIDNumber] , SickLeaveHours as [SickHours] , [Vacationhours] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [ SalariedFlag] ИЗ [AdventureWorks2017]. [HumanResources]. [Сотрудник] Где MaritalStatus = ‘M’ Упорядочить по DATEPART (ГОД, Дата рождения) ASC |
Пример 6: Сортировка результатов с помощью сортировки с использованием предложения SQL Order By
Предположим, у нас есть таблица, содержащая столбец с данными, чувствительными к регистру. Мы могли бы захотеть отсортировать результаты, указав сопоставление в предложении Order by.
Давайте создадим таблицу с сопоставлением Latin1_General_CI_AI , а позже мы отсортируем ее, используя другое сопоставление Latin1_General_CS_AS.
Вы можете найти определение обоих сопоставлений в следующей таблице.
Latin1_General_CI_AI | Latin1-General, без учета регистра, без учета диакритического знака, без учета канатического типа, без учета ширины |
Latin1_General_CS_AS | Latin1-General, с учетом регистра, с учетом диакритических знаков, без учета канатического типа, без учета ширины |
Использовать SQLShackDemo Go СОЗДАТЬ ТАБЛИЦУ # temp1 (EmpName nvarchar (20) COLLATE Latin1_General_CI_AI) GO INSERT INTO # temp1 VALUES (N’Rajendra ‘), (N’raJend ‘), (Н’раджЕНДРА’), (Н’раджендра ‘), (Н’РАДЖЕНДРА’); |
Давайте отсортируем результаты без указания каких-либо условий сортировки. Он использует сопоставление, определенное в столбце EmpName (Latin1_General_CI_AI).
Запрос 1:
ВЫБРАТЬ EmpName FROM # temp1 ORDER BY EmpName; |
Запрос 2:
ВЫБРАТЬ EmpName FROM # temp1 ORDER BY EmpName COLLATE Latin1_General_CS_AS |
В следующем выводе вы можете увидеть разницу в результатах обоих запросов.В Query1 для сортировки результатов используется сортировка столбцов по умолчанию ( Latin1_General_CI_AI_AI ). В Query2 для сортировки результатов используется сопоставление ( Latin1_General_CS_AS ), указанное в предложении Order by.
Пример 7: Сортировка результатов с помощью функции ранжирования с использованием предложения SQL Order By
Мы также можем использовать встроенные функции R anking в SQL Server с предложением Order by. Мы можем использовать функции ранга для определения ранга в наборе строк.У нас есть следующие функции ранжирования в SQL Server.
- ROW_NUMBER
- РАНГ
- DENSE_RANK
- НТИЛЬ
Давайте рассмотрим использование предложения Order By с каждой функцией ранжирования.
НОМЕР СТРОКИ
Мы можем использовать ROW_NUMBER для предоставления номера строки в указанном столбце на основе предложения Order By.
В следующем запросе мы хотим получить номер строки для значений столбца SickLeaveHours в порядке возрастания.
SELECT [NationalIDNumber] , SickLeaveHours , ROW_NUMBER () OVER (ЗАКАЗАТЬ ПО [SickLeaveHours] ASC) AS «Row_Number» FROM [AdventureWorks2017]. [HumanResources]. [Employee] Where MaritalStatus = Где MaritalStatus = Где Marital ‘ |
RANK: В функции Rank мы получаем рейтинг для каждой строки на основе указанного значения столбца. Если имеется несколько строк с одинаковым значением, он дает одинаковый ранг, но пропускает следующий номер в последовательности.
В следующем запросе мы указали функцию Row_Number () и RANK () вместе с предложением Order by для столбца SickLeaveHours .
SELECT [NationalIDNumber] , SickLeaveHours , ROW_NUMBER () OVER (ЗАКАЗАТЬ ПО [SickLeaveHours] ASC) AS «Row_Number» , RANK () OVER (ORDER BY SickLeaveHours) AS «Rank» FROM [Rank » FROM ].[HumanResources]. [Сотрудник] , где MaritalStatus = ‘M’ |
На следующем снимке экрана мы видим результат, отсортированный с использованием SickLeaveHours . В функции Rank пропускается значение 2-3, потому что у нас есть 3 строки для SickLeaveHours 20.
Точно так же мы можем использовать DENSE_RANK () и NTILE (4) с предложением Order by в операторе select.
SELECT [NationalIDNumber] , SickLeaveHours , ROW_NUMBER () OVER (ЗАКАЗАТЬ ПО [SickLeaveHours] ASC) КАК «Номер строки» , RANK () OVER (ЗАКАЗАТЬ ПО SickLeaveHours) AS «Rank» , DEN () OVER (ORDER BY SickLeaveHours) AS «DENSE_Rank», NTILE (4) OVER (ORDER BY SickLeaveHours) AS [NTILE] FROM [AdventureWorks2017].[HumanResources]. [Сотрудник] , где MaritalStatus = ‘M’ |
В выходных данных мы видим DENSE_RANK () дает ранг для каждой строки на основе условий, указанных в предложении Order by. Он не пропускает следующее значение в ранге, если у нас есть несколько строк с похожими значениями.
Функция NTILE делит полные наборы результатов на указанное количество групп.
Пример 8: Ограничение количества строк с помощью предложения SQL Order By
Мы можем пропустить некоторые строки с помощью OFFSET и FETCH в предложении Order by. Сначала давайте запустим следующий запрос и просмотрим результат в SSMS.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017] [AdventureWorks2017]. HumanResources]. [Сотрудник] , где Salariedflag = 0 Упорядочить по дате рождения |
На следующем снимке экрана мы видим, что этот запрос возвращает 238 строк.
Предположим, мы хотим пропустить первые 100 строк из отсортированного набора результатов и вернуть все оставшиеся строки. Мы можем использовать OFFSET с предложением Order by.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017]. [HumanResources]. [Сотрудник] , где Salariedflag = 0 Упорядочить по дате рождения OFFSET 100 ROWS; |
На выходе мы получаем 138 строк, потому что он пропускает первые 100 строк из отсортированного результата.
Предположим, мы хотим пропустить 100 строк из отсортированного результата. Далее нам нужны только первые 20 строк из набора результатов. Мы можем указать следующие значения вместе с предложением Order by.
- OFFSET значение 100
- FETCH NEXT значение 20
Выполните следующий запрос и просмотрите результат.
SELECT [NationalIDNumber] , [JobTitle] , [BirthDate] , [MaritalStatus] , [Gender] , [ModifiedDate] , [SalariedFlag] FROM [AdventureWorks2017] [AdventureWorks2017]. HumanResources]. [Сотрудник] Где Salariedflag = 0 Упорядочить по дате рождения СМЕЩАТЬ 100 СТРОК НАБИРАТЬ ТОЛЬКО СЛЕДУЮЩИЕ 20 СТРОК; |
На выходе мы видим, что только первые 20 строк после пропуска 100 записей в отсортированном результате.
Примечание : мы можем использовать OFFSET и FETCH в предложении SQL Order By, начиная с SQL Server 2012.
Раджендра имеет более 8 лет опыта в администрировании баз данных, он увлечен оптимизацией производительности баз данных, мониторингом, технологиями высокой доступности и аварийного восстановления, изучением новых вещей, новыми функциями. Работая старшим консультантом администратора баз данных для крупных заказчиков и получив сертификат MCSA SQL 2012, он любит делиться знаниями в различных блогах.
С ним можно связаться по адресу [email protected]
Просмотреть все сообщения Rajendra Gupta
Последние сообщения Rajendra Gupta (посмотреть все)sql заказать по куланм наслдр
ЗАКАЗ SQL ПО Kullanm
ЗАКАЗАТЬ ifadesi kaytlar belirtilen alanda bykten ke veya kkten пока, gre sralar. Параметр ASC (по возрастанию) kkten bye, DESC (по убыванию) параметреси ile bykten ke gre sralar. Burada sadece говорит alanlar deil metinsel alanlarda alfabetik olarak sralanabilir.
ЗАКАЗАТЬ Kullanm Biimi
ВЫБРАТЬ alan_adi1, alan_adi2 ОТ tablo_adi ЗАКАЗАТЬ от alan_adi2 ASC ВЫБЕРИТЕ alan_adi1, alan_adi2 ОТ tablo_adi ЗАКАЗАТЬ alan_adi2 DESC |
рнек Табло Уйгуламас:
рнек оларак аадаки гиби Персонал исимли табломуз олсун.
id | Adi_soyadi | Сехир | Болум | Меслек_Коду |
1 | Салих ЭСКОЛУ | станбуль | Билги лем Сорумлусу | 1234567 |
2 | Айхан ETNKAYA | Коджаэли | дари лер Yneticisi | 2345678 |
3 | Серкан ЗГРЭЛ | Эрзинджан | Мухасебе | 3456789 |
4 | lhan ZL | станбуль | Blgi lem Сорумлусу | 2345678 |
rnek1:
ВЫБРАТЬ * ИЗ персонала ЗАКАЗАТЬ Меслек_Коду ASC
Бу код таблодаки Меслек_Коду аланна грэ кайтлар кктен бай дору алр.
узлов:
id | Adi_soyadi | Сехир | Болум | Меслек_Коду |
1 | Салих ЭСКОЛУ | станбуль | Билги лем Сорумлусу | 1234567 |
2 | Айхан ETNKAYA | Коджаэли | дари лер Yneticisi | 2345678 |
4 | lhan ZL | станбуль | Blgi lem Сорумлусу | 2345678 |
3 | Серкан ЗГРЭЛ | Эрзинджан | Мухасебе | 3456789 |
рнек2:
ВЫБРАТЬ * ИЗ персонала ЗАКАЗ ОТ Adi_soyadi DESC
Bu kod Adi_soyadi alanna gre kaytlar bykten ke yani Z harfinden A harfine doru dizer..
узлов:
id | Adi_soyadi | Сехир | Болум | Меслек_Коду |
3 | Серкан ЗГРЭЛ | Эрзинджан | Мухасебе | 3456789 |
1 | Салих ЭСКОЛУ | станбуль | Билги лем Сорумлусу | 1234567 |
4 | lhan ZL | станбуль | Blgi lem Сорумлусу | 2345678 |
2 | Айхан ETNKAYA | Коджаэли | дари лер Yneticisi | 2345678 |
рнек3:
ВЫБРАТЬ * ОТ персонала Где Sehir = ‘stanbul’ ЗАКАЗАТЬ Meslek_kodu ASC
Bu kod Sehir alannda stanbul yazan kaytlar seer. ЗАКАЗАТЬ ise sadece bu сейли олан кайтлар зеринде Meslek_kodu alann baz alarak kkten bye дору шралама япар.
узлов:
id | Adi_soyadi | Сехир | Болум | Меслек_Коду |
1 | Салих ЭСКОЛУ | станбуль | Билги лем Сорумлусу | 1234567 |
4 | lhan ZL | станбуль | Blgi lem Сорумлусу | 2345678 |
rnek4:
ВЫБРАТЬ * ИЗ персонала ЗАКАЗАТЬ ПО Meslek_Kodu ASC, Bolum DESC
Bu kod tablodaki Meslek_Kodu alanna gre kaytlar kkten bye doru sralanrken ayn koda sahip kayt olduunda Bolum alan dikkate alnr.Bolum Алан Исе DESC яни быктен ке дору сраланр. lgili tabloda 2345678 nolu meslek kodundan iki tane vardr. Bu durumda Bolum alan kendi iinde bykten ke doru sralanacaktr. Alfabede «» harfi «B» harfinden sonra geldii iin Даха Бык Кабул Эдилир ве сралама ilemi yaplr.
узлов:
id | Adi_soyadi | Сехир | Болум | Меслек_Коду |
1 | Салих ЭСКОЛУ | станбуль | Билги лем Сорумлусу | 1234567 |
2 | Айхан ETNKAYA | Коджаэли | дари лер Yneticisi | 2345678 |
4 | lhan ZL | станбуль | Blgi lem Сорумлусу | 2345678 |
3 | Серкан ЗГРЭЛ | Эрзинджан | Мухасебе | 3456789 |
rnek5:
ВЫБРАТЬ * ИЗ персонала ЗАКАЗ: Меслек_Коду, Болум ASC
Бу код таблодаки Меслек_Коду аланна ве Болум коду аланна гре кайтлар kkten bye doru sralama yaplr.ncelikli olarak Meslek_kodu alanna gre sralama yaplr. Даха сонра айн меслек кодуна сахип аланлардан Болум аланна бакарак сралама яплр.