При выборке данных бывает важно получить их в определенном упорядоченном виде. Сортировка может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она так же является сортировкой по возрастанию или убыванию. Она так же может быть выполнена в любых направлениях – от А, до Я, и наоборот от Я, до А.
Суть процесса сортировки заключается к приведению последовательности к определенному порядку. Подробней о сортировки можно узнать в статье «Алгоритмы сортировки». Например, сортировка произвольной числовой последовательности по возрастанию:
2, 4, 1, 5, 9
должна привести к упорядоченной последовательности:
1, 2, 4, 5, 6
Аналогично, при сортировке по возрастанию строковых значений:
Иванов Иван, Петров Петр, Иванов Андрей
результат должен быть:
Иванов Андрей, Иванов Иван, Петров Петр
Здесь строка «Иванов Андрей» перешла в начало, так как сравнение строк производится посимвольно. Обе строки начинаются одинаковых символов «Иванов «. Так как символ «А» в слове «Андрей» идет раньше в алфавите, чем символ «И» в слове «Иван», то эта строка будет поставлена раньше.
Сортировка в запросе SQL
Для выполнения сортировки в строку запроса нужно добавить команду ORDER BY. После этой команды указывается поле, по которому производится сортировка.
Для примеров используем таблицу товаров goods:
num (номер товара) |
title (название) |
price (цена) |
1 | Мандарин | 50 |
2 | Арбуз | 120 |
3 | Ананас | 80 |
4 | Банан | 40 |
Данные здесь уже упорядочены по столбцу «num». Теперь, построим запрос, который выведет таблицу с товарами, упорядоченными в алфавитном порядке:
SELECT * FROM goods ORDER BY title
SELECT * FROM goods – указывает выбрать все поля из таблицы goods;
ORDER BY – команда сортировки;
title – столбец, по которому будет выполняться сортировка.
Результат выполнения такого запроса следующий:
num | title | price |
3 | Ананас | 80 |
2 | Арбуз | 120 |
4 | Банан | 40 |
1 | Мандарин | 50 |
Так же можно выполнить сортировку для любого из полей таблицы.
Направление сортировки
По умолчанию, команда ORDER BY выполняет сортировку по возрастанию. Чтобы управлять направлением сортировки вручную, после имени столбца указывается ключевое слово ASC (по возрастанию) или DESC (по убыванию). Таким образом, чтобы вывести нашу таблицу в порядке убывания цен, нужно задать запрос так:
SELECT * FROM goods ORDER BY price DESC
Сортировка по возрастанию цены будет:
SELECT * FROM goods ORDER BY price ASC
Сортировка по нескольким полям
SQL допускает сортировку сразу по нескольким полям. Для этого после команды ORDER BY необходимые поля указываются через запятую. Порядок в результате запроса будет настраиваться в той же очередности, в которой указаны поля сортировки.
column1 | column2 | column3 |
3 | 1 | c |
1 | 3 | c |
2 | 2 | b |
2 | 1 | b |
1 | 2 | a |
1 | 3 | a |
3 | 4 | a |
Отсортируем таблицу по следующим правилам:
SELECT * FROM mytable ORDER BY column1 ASC, column2 DESC, column3 ASC
Т.е. первый столбец по возрастанию, второй по убыванию, третий опять по возрастанию. Запрос упорядочит строки по первому столбцу, затем, не разрушая первого правила, по второму столбцу. Затем, так же, не нарушая имеющихся правил, по третьему. В результате получится такой набор данных:
column1 | column2 | column3 |
1 | 3 | a |
1 | 3 | c |
1 | 2 | a |
2 | 2 | b |
2 | 1 | b |
3 | 1 | a |
3 | 1 | c |
Порядок команды ORDER BY в запросе
Сортировка строк чаще всего проводится вместе с условием на выборку данных. Команда ORDER BY ставится после условия выборки WHERE. Например, выбираем товары с ценой меньше 100 рублей, упорядочив по названию в алфавитном порядке:
SELECT * FROM goods WHERE price < 100 ORDER BY title ASC
При выполнении SELECT запроса, строки по умолчанию
возвращаются в неопределённом порядке. Фактический порядок строк в этом случае
зависит от плана соединения и сканирования, а также от порядка расположения
данных на диске, поэтому полагаться на него нельзя. Для упорядочивания записей
используется конструкция ORDER BY.
Общая структура запроса с оператором ORDER BY
SELECT поля_таблиц FROM наименование_таблицы WHERE ... ORDER BY столбец_1 [ASC | DESC][, столбец_n [ASC | DESC]]
Где ASC и DESC — направление сортировки:
- ASC — сортировка по возрастанию (по умолчанию)
- DESC — сортировка по убыванию
Сортировка по нескольким столбцам
Для сортировки результатов по двум или более столбцам их следует указывать
через запятую.
...ORDER BY столбец_1 [ASC | DESC], столбец_2 [ASC | DESC];
Данные будут сортироваться по первому столбцу, но в случае если попадаются несколько записей с совпадающими значениями в первом столбце,
то они сортируются по второму столбцу. Количество столбцов, по которым можно отсортировать, не ограничено.Правило сортировки применяется только к тому столбцу, за которым оно следует.
ORDER BY столбец_1, столбец_2 DESC
не то же самое, что
ORDER BY столбец_1 DESC, столбец_2 DESC
Примеры использования
-
Выведем названия авиакомпаний в алфавитном порядке из таблицы Company:
Сортировка строковых данных по возрастанию подразумевает сортировку в лексикографическом (алфавитном) порядке.
SELECT name FROM Company ORDER BY name;
-
Выведем информацию о полётах, отсортированную по городу вылета самолёта в порядке возрастания и по городу прибытия в аэропорт в порядке убывания, из таблицы Trip:
SELECT DISTINCT town_from, town_to FROM Trip ORDER BY town_from, town_to DESC;
В данном примере в начале записи сортируются по полю town_from. Затем там, если есть несколько записей с одинаковым значением в поле town_from,
то отрабатывает обратная сортировка по полю town_to.
В этой статье приведены примеры использования оператора ORDER BY
для сортировки записей в MySQL.
Синтаксис оператора ORDER BY:
SELECT
*
FROM
`table`
ORDER BY
`столбец` [ASC | DESC]
SQL
1
Направление сортировки
ASC
– (по умолчанию, необязательный). Сортирует набор в порядке возрастания или по алфавиту.
SELECT
*
FROM
`table`
ORDER BY
`name` ASC
SQL
DESC
– сортирует в порядке убывания.
SELECT
*
FROM
`table`
ORDER BY
`name` DESC
SQL
2
Сортировка по нескольким столбцам
Также возможно сделать сортировку по несколькольким столбцам, указывая их через запятую в порядке приоритета.
SELECT
*
FROM
`table`
ORDER BY
`name` DESC, `text` DESC
SQL
3
Сортировка по определенной последовательности
С помощью функции FIELD()
можно получить записи из БД в нужной последовательности, например вывести первыми записи с определенными `id`
.
SELECT
*
FROM
`table`
ORDER BY
FIELD(`id`, 1,2,3)
SQL
Также можно скомбинировать сортировку из нескольких полей и показать первыми приоритетные записи, а далее по алфавиту.
SELECT
*
FROM
`table`
ORDER BY
FIELD(`id`, 1,2,3) DESC, `name`
SQL
Или убрать в конец ненужные записи:
SELECT
*
FROM
`table`
ORDER BY
FIELD(`id`, 55), `name`
SQL
4
Сортировка по цене, но исключая нулевые значения
В списках товаров отсортировать значения цен по возрастанию, но при этом нулевые значения были в конце поможет следующий пример.
SELECT
*
FROM
`table`
ORDER BY
IF(`price` > 0, 0, 1), `price`
SQL
5
Сортировка по данным из другой таблицы
К примеру имеется таблица брендов и товаров, нужно отсортировать бренды по количеству товаров.
SELECT
*,
(SELECT COUNT(*) FROM `prods` WHERE `brand_id` = `brands`.`id`) AS `prod_count`
FROM
`brands`
ORDER BY
`prod_count` DESC
SQL
6
Сортировка в случайном порядке
SELECT
*
FROM
`table`
ORDER BY
RAND()
SQL
7
Сортировка дат
Проблема возникает если даты хранятся в текстовом виде (например 23.09.2020). Если отсортировать таблицу по такому полю, то результате будут перепутаны месяцы.
Текстовую дату нужно перевести в тип datetime c помощью функции STR_TO_DATE()
, указав нужный формат:
SELECT
*,
STR_TO_DATE(`date`, '%d.%m.%Y') AS `tmp_date`
FROM
`table`
ORDER BY
`tmp_date` DESC
SQL
8
Проблема с тапами данных
Если в сортируемом поле содержатся одновременно текст и цифры, а нужно отсортировать только по цифрам, то данные нужно привести к числовому типу:
SELECT
*,
CAST(`name` AS SIGNED) AS `name_tmp`
FROM
`table`
ORDER BY
`name_tmp`
SQL
или
SELECT
*
FROM
`table`
ORDER BY
CAST(`name` AS SIGNED)
SQL
Для чисел с плавающей точкой:
SELECT
*
FROM
`table`
ORDER BY
CAST(`name` AS DECIMAL(11,2))
SQL
9
Сортировка по количеству символов
SELECT * FROM `table` ORDER BY CHAR_LENGTH(`name`) DESC
SQL
В этом учебном материале вы узнаете, как использовать SQL оператор ORDER BY с синтаксисом и примерами.
Описание
SQL оператор ORDER BY используется для сортировки записей в наборе результатов запроса SELECT.
Синтаксис
Синтаксис для оператора ORDER BY в SQL.
SELECT expressions
FROM tables
[WHERE conditions]
ORDER BY expression [ ASC | DESC ];
Параметры или аргумент
- expressions
- Столбцы или расчеты, которые вы хотите получить
- tables
- Таблицы, из которых вы хотите получить записи. В предложении FROM должна быть указана хотя бы одна таблица
- WHERE conditions
- Необязательный. Условия, которые должны быть выполнены для записей, которые будут выбраны
- ASC
- Необязательный. ASC сортирует результирующий набор в порядке возрастания по expressions. Это поведение по умолчанию, если модификатор не указан.
- DESC
- Необязательный. DESC сортирует результирующий набор в порядке убывания по expressions
Примечание
- Если модификатор ASC или DESC не указан в предложении ORDER BY, результаты будут отсортированы по expressions в порядке возрастания. Это эквивалентно
ORDER BY expressions ASC
Пример — сортировка результатов по возрастанию
Чтобы отсортировать результаты в порядке возрастания, вы можете указать атрибут ASC. Если после поля в предложении ORDER BY не указано значение (ASC или DESC), порядок сортировки по умолчанию будет соответствовать возрастающему. Давайте рассмотрим это дальше.
В этом примере у нас есть таблица customers со следующими данными:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
Введите следующий SQL оператор.
SELECT * FROM customers ORDER BY last_name; |
Будет выбрано 6 записей. Вот результаты, которые вы должны получить.
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
9000 | Russell | Crowe | google.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
В этом примере будут возвращены все записи из таблицы customers, отсортированные по полю last_name в порядке возрастания, и будет эквивалентен следующему SQL предложению ORDER BY.
SELECT * FROM customers ORDER BY last_name ASC; |
Большинство программистов пропускают атрибут ASC при сортировке в порядке возрастания.
Пример — сортировка результатов по убыванию
При сортировке набора результатов в порядке убывания вы используете атрибут DESC в предложении ORDER BY. Давайте внимательнее посмотрим.
В этом примере у нас есть таблица suppliers со следующими данными:
supplier_id | supplier_name | city | state |
---|---|---|---|
100 | Yandex | Moscow | Russian |
200 | Lansing | Michigan | |
300 | Oracle | Redwood City | California |
400 | Bing | Redmond | Washington |
500 | Yahoo | Sunnyvale | Washington |
600 | DuckDuckGo | Paoli | Pennsylvania |
700 | Qwant | Paris | France |
800 | Menlo Park | California | |
900 | Electronic Arts | San Francisco | California |
Введите следующий SQL оператор.
SELECT * FROM suppliers WHERE supplier_id > 40 ORDER BY supplier_id DESC; |
Будет выбрано 5 записей. Вот результаты, которые вы должны получить.
supplier_id | supplier_name | city | state |
---|---|---|---|
900 | Electronic Arts | San Francisco | California |
800 | Menlo Park | California | |
700 | Qwant | Paris | France |
600 | DuckDuckGo | Paoli | Pennsylvania |
500 | Yahoo | Sunnyvale | Washington |
В этом примере будет отсортирован набор результатов по полю supplier_id в порядке убывания.
Пример — сортировка результатов по относительной позиции
Вы также можете использовать SQL оператор ORDER BY для сортировки по относительной позиции в наборе результатов, где первое поле в наборе результатов равно 1, второе поле равно 2, третье поле равно 3 и т.д.
В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Теперь введите следующий SQL оператор.
SELECT product_id, product_name FROM products WHERE product_name <> ‘Bread’ ORDER BY 1 DESC; |
Будет выбрано 6 записей. Вот результаты, которые вы должны получить.
product_id | product_name |
---|---|
7 | Kleenex |
6 | Sliced Ham |
4 | Apple |
3 | Orange |
2 | Banana |
1 | Pear |
В этом примере результаты сортируются по полю product_id в порядке убывания, поскольку поле product_id находится в позиции № 1 в наборе результатов и будет эквивалентно следующему SQL оператору ORDER BY.
SELECT product_id, product_name FROM products WHERE product_name <> ‘Bread’ ORDER BY product_id DESC; |
Пример — использование атрибутов ASC и DESC
При сортировке набора результатов с помощью SQL предложения ORDER BY вы можете использовать атрибуты ASC и DESC в одном операторе SELECT.
В этом примере давайте использовать ту же таблицу products, что и в предыдущем примере.
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
Теперь введите следующий SQL оператор.
SELECT * FROM products WHERE product_id <> ORDER BY category_id DESC, product_name ASC; |
Будет выбрано 6 записей. Вот результаты, которые вы должны получить.
product_id | product_name | category_id |
---|---|---|
5 | Bread | 75 |
4 | Apple | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
1 | Pear | 50 |
6 | Sliced Ham | 25 |
В этом примере возвращаются записи, отсортированные по полю category_id в порядке убывания, а вторичная сортировка — по полю product_name в порядке возрастания.
Сортировка. ORDER BY
Последнее обновление: 13.07.2017
Оператор ORDER BY позволяет отсортировать извлекаемые значения по определенному столбцу:
SELECT * FROM Products ORDER BY ProductName
В данном случае строки сортируются по возрастанию значения столбца ProductName:
Сортировку также можно проводить по псевдониму столбца, который определяется с помощью оператора AS:
SELECT ProductName, ProductCount * Price AS TotalSum FROM Products ORDER BY TotalSum
По умолчанию применяется сортировка по возрастанию. С помощью дополнительного оператора DESC можно задать сортировку по убыванию.
SELECT ProductName FROM Products ORDER BY ProductName DESC
По умолчанию вместо DESC используется оператор ASC:
SELECT ProductName FROM Products ORDER BY ProductName ASC
Если необходимо отсортировать сразу по нескольким столбцам, то все они перечисляются после оператора ORDER BY:
SELECT ProductName, Price, Manufacturer FROM Products ORDER BY Manufacturer, ProductName
В этом случае сначала строки сортируются по столбцу Manufacturer по возрастанию. Затем если есть две строки, в которых столбец Manufacturer имеет одинаковое значение, то
они сортируются по столбцу ProductName также по возрастанию. Но опять же с помощью ASC и DESC можно отдельно для разных столбцов определить сортировку по возрастанию и
убыванию:
SELECT ProductName, Price, Manufacturer FROM Products ORDER BY Manufacturer ASC, ProductName DESC
В качестве критерия сортировки также можно использовать сложно выражение на основе столбцов:
SELECT ProductName, Price, ProductCount FROM Products ORDER BY ProductCount * Price