Sql упорядочить по убыванию: SQL Инструкция ORDER BY

Содержание

Запрос 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

Результат тот же, что и в предыщем запросе, но данные расположены по убыванию относительно поля «

date_registration«.

Разумеется, никто Вам не мешает использовать полноценный 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.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:
    <a href=»https://myrusakov. ru» target=»_blank»><img src=»https://myrusakov.ru/images/button.gif» alt=»Как создать свой сайт» /></a>

    Она выглядит вот так:

  2. Текстовая ссылка:
    <a href=»https://myrusakov.ru» target=»_blank»>Как создать свой сайт</a>

    Она выглядит вот так: Как создать свой сайт

  3. 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 с ключевым словом 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, то у нас будет такая последовательность вывода: 

  1. Числа
  2. Буквы английского алфавита
  3. Буквы русского алфавита

 

Сортировка массивов и дат в 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)

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *