Сортировка данных в SQL (ORDER BY)
При выборке данных бывает важно получить их в определенном упорядоченном виде. Сортировка может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она так же является сортировкой по возрастанию или убыванию. Она так же может быть выполнена в любых направлениях – от А, до Я, и наоборот от Я, до А.
Суть процесса сортировки заключается к приведению последовательности к определенному порядку. Подробней о сортировки можно узнать в статье «Алгоритмы сортировки». Например, сортировка произвольной числовой последовательности по возрастанию:
должна привести к упорядоченной последовательности:
Аналогично, при сортировке по возрастанию строковых значений:
Иванов Иван, Петров Петр, Иванов Андрей
результат должен быть:
Иванов Андрей, Иванов Иван, Петров Петр
Здесь строка «Иванов Андрей» перешла в начало, так как сравнение строк производится посимвольно. Обе строки начинаются одинаковых символов «Иванов «. Так как символ «А» в слове «Андрей» идет раньше в алфавите, чем символ «И» в слове «Иван», то эта строка будет поставлена раньше.
Сортировка в запросе 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
Как отсортировать по алфавиту в sql
При выполнении SELECT запроса, строки по умолчанию возвращаются в неопределённом порядке. Фактический порядок строк в этом случае зависит от плана соединения и сканирования, а также от порядка расположения данных на диске, поэтому полагаться на него нельзя. Для упорядочивания записей используется конструкция ORDER BY .
MySQLSELECT поля_таблиц FROM наименование_таблицы WHERE ... ORDER BY столбец_1 [ASC | DESC][, столбец_n [ASC | DESC]]Где ASC и DESC - направление сортировки:
- ASC - сортировка по возрастанию (по умолчанию)
- DESC - сортировка по убыванию
Для сортировки результатов по двум или более столбцам их следует указывать через запятую.
MySQL...ORDER BY столбец_1 [ASC | DESC], столбец_2 [ASC | DESC];Данные будут сортироваться по первому столбцу, но в случае если попадаются несколько записей с совпадающими значениями в первом столбце, то они сортируются по второму столбцу. Количество столбцов, по которым можно отсортировать, не ограничено.
Правило сортировки применяется только к тому столбцу, за которым оно следует.
ORDER BY столбец_1, столбец_2 DESC
не то же самое, что
ORDER BY столбец_1 DESC, столбец_2 DESC
- Выведем названия авиакомпаний в алфавитном порядке из таблицы Company :
Сортировка строковых данных по возрастанию подразумевает сортировку в лексикографическом (алфавитном) порядке.
MySQLSELECT name FROM Company ORDER BY name;
name Aeroflot air_France British_AW Dale_avia Don_avia Сортировка данных — Основы SQL
Обычно у выборки данных из базы нет определенного порядка. Точнее, порядок есть, но он логически не обоснован. По умолчанию база возвращает данные в том порядке, в котором ей удобнее. Иногда этот порядок может совпасть с желаемым, но рассчитывать на это нельзя.
Теоретически порядок может поменяться при следующем запросе, или когда количество данных в таблице изменится. Обновление версии базы данных тоже может повлиять на это.
В этом уроке мы разберем, как сортировать данные в базе в том порядке, который нам нужен. Для этого используется запрос ORDER BY .
Как устроен запрос на сортировку
Допустим, нам нужно отсортировать данные в базе:
Сортировка задается с помощью оператора ORDER BY . За ней следует имя поля, по которому происходит сортировка:
SELECT * FROM users ORDER BY username;Такой запрос вернет всю информацию о пользователях, отсортированную по username . Если порядок не указан, то сортировка происходит по возрастанию ASC .
Сортировка подразумевает сравнение значений между собой. По какому принципу база данных сортирует строки username , как в примере выше? Самый распространенный способ — лексикографический порядок, то есть по алфавиту.
База данных знает, как сравнивать не только числа, но и строки, и даты. Сортировка по датам — крайне частая операция, выглядит она идентично любой другой сортировке:
SELECT * FROM users ORDER BY created_at;Здесь мы отсортировали пользователей по дате создания в прямом порядке, то есть по возрастанию.
Как управлять порядком сортировки
Сортировать данные можно разными способами:
- В прямом порядке
- В обратном порядке
- По нескольким полям
Прямой порядок сортировки
Если ничего дополнительно не указывать, то ORDER BY сортирует в прямом порядке — от меньшего к большему. Запрос выше — это сокращенная версия полного запроса с сортировкой.
Полный запрос включает в себя ASC , который подставляется автоматически, если ничего не указано:
SELECT * FROM users ORDER BY created_at ASC; -- То же самое, что и SELECT * FROM users ORDER BY created_at;Обратный порядок сортировки
Чтобы выполнить сортировку в обратном порядке, указываем DESC :
SELECT * FROM users ORDER BY created_at DESC;Сортировка по нескольким полям
Иногда нужно отсортировать данные сразу по нескольким полям. Этого можно достичь, если перечислить поля через запятую:
SELECT * FROM users ORDER BY first_name, created_at;Порядок сортировки в таком случае задается для каждого поля в отдельности:
SELECT first_name, created_at FROM users ORDER BY first_name ASC, created_at DESC;Сортировка в MySQL
В этой статье приведены примеры использования оператора ORDER BY для сортировки записей в MySQL.
Синтаксис оператора ORDER BY:
SELECT * FROM `table` ORDER BY `столбец` [ASC | DESC]Направление сортировки
ASC – (по умолчанию, необязательный). Сортирует набор в порядке возрастания или по алфавиту.
SELECT * FROM `table` ORDER BY `name` ASCDESC – сортирует в порядке убывания.
SELECT * FROM `table` ORDER BY `name` DESCСортировка по нескольким столбцам
Также возможно сделать сортировку по несколькольким столбцам, указывая их через запятую в порядке приоритета.
SELECT * FROM `table` ORDER BY `name` DESC, `text` DESCСортировка по определенной последовательности
С помощью функции FIELD() можно получить записи из БД в нужной последовательности, например вывести первыми записи с определенными `id` .
SELECT * FROM `table` ORDER BY FIELD(`id`, 1,2,3)Также можно скомбинировать сортировку из нескольких полей и показать первыми приоритетные записи, а далее по алфавиту.
SELECT * FROM `table` ORDER BY FIELD(`id`, 1,2,3) DESC, `name`Или убрать в конец ненужные записи:
SELECT * FROM `table` ORDER BY FIELD(`id`, 55), `name`Сортировка по цене, но исключая нулевые значения
В списках товаров отсортировать значения цен по возрастанию, но при этом нулевые значения были в конце поможет следующий пример.
SELECT * FROM `table` ORDER BY IF(`price` > 0, 0, 1), `price`Сортировка по данным из другой таблицы
К примеру имеется таблица брендов и товаров, нужно отсортировать бренды по количеству товаров.
SELECT *, (SELECT COUNT(*) FROM `prods` WHERE `brand_id` = `brands`.`id`) AS `prod_count` FROM `brands` ORDER BY `prod_count` DESCСортировка в случайном порядке
SELECT * FROM `table` ORDER BY RAND()Сортировка дат
Проблема возникает если даты хранятся в текстовом виде (например 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Проблема с тапами данных
Если в сортируемом поле содержатся одновременно текст и цифры, а нужно отсортировать только по цифрам, то данные нужно привести к числовому типу:
SELECT *, CAST(`name` AS SIGNED) AS `name_tmp` FROM `table` ORDER BY `name_tmp`SELECT * FROM `table` ORDER BY CAST(`name` AS SIGNED)Для чисел с плавающей точкой:
SELECT * FROM `table` ORDER BY CAST(`name` AS DECIMAL(11,2))Сортировка по количеству символов
SELECT * FROM `table` ORDER BY CHAR_LENGTH(`name`) DESCПредыдущая запись
