При выборке данных бывает важно получить их в определенном упорядоченном виде. Сортировка может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она так же является сортировкой по возрастанию или убыванию. Она так же может быть выполнена в любых направлениях – от А, до Я, и наоборот от Я, до А.
Суть процесса сортировки заключается к приведению последовательности к определенному порядку. Подробней о сортировки можно узнать в статье «Алгоритмы сортировки». Например, сортировка произвольной числовой последовательности по возрастанию:
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
Последнее обновление: 16.05.2018
Оператор ORDER BY сортируют значения по одному или нескольких столбцам. Например, упорядочим выборку из таблицы Products
по столбцу Price:
SELECT * FROM Products ORDER BY Price;
Также можно производить упорядочивание данных по псевдониму столбца, который определяется с помощью оператора AS:
SELECT ProductName, ProductCount * Price AS TotalSum FROM Products ORDER BY TotalSum;
В качестве критерия сортировки также можно использовать сложно выражение на основе столбцов:
SELECT ProductName, Price, ProductCount FROM Products ORDER BY ProductCount * Price;
Сортировка по убыванию
По умолчанию данные сортируются по возрастанию, однако с помощью оператора DESC можно задать сортировку по убыванию.
SELECT ProductName, ProductCount FROM Products ORDER BY ProductCount DESC;
По умолчанию вместо DESC используется оператор ASC, который сортирует по возрастанию:
SELECT ProductName, ProductCount FROM Products ORDER BY ProductCount 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;