Как сделать сортировку в 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 Урок 4. Сортировка результатов
В SQL часто кроме фильтрации данных, также часто требуется отсортировать их по одному из столцов.
В первом уроке мы написали SQL-запрос для получения данных о совершенолетних пользователях. Посмотрим на него еще раз:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18Совершеннолетние пользователи
id last_name first_name birthday 1 Иванов Дмитрий 1996-12-11 3 Шевченко Тимур 1998-04-27 4 Иванова Светлана 1993-08-06 6 Иванов Алексей 1993-08-05 7 Процук Алена 1997-02-28 Обратите внимание, что сейчас данные никак не упорядочены. Ни по фамилии, ни по имени, ни по дате рождения. Но давайте добавим после конструции WHERE: ORDER BY last_name:.
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY last_nameПосле выполнение данного SQL запроса мы получим таблицу отсортированную по столбцу last_name (фамилия). Так как last_name хранит строки, то сортировка происходит в алфавитном порядке:
Сортировка по фамилии
id last_name first_name birthday 1 Иванов Дмитрий 1996-12-11 6 Иванов Алексей 1993-08-05 4 Иванова Светлана 1993-08-06 7 Процук Алена 1997-02-28 3 Шевченко Тимур 1998-04-27 Обратите внимание, что данные отсортированы только по фамилии, но не по другим полям. Однако давайте добавим через запятую еще один столбец, например, first_name:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY last_name, first_nameТеперь таблица отсортирована сразу по двум поля, сперва по фамилии, а уже затем по имени:
Сортировка по фамилии и имени
id last_name first_name birthday 6 Иванов Алексей 1993-08-05 1 Иванов Дмитрий 1996-12-11 4 Иванова Светлана 1993-08-06 7 Процук Алена 1997-02-28 3 Шевченко Тимур 1998-04-27 Разумеется, сортировать можно не только по текстовым полям. Например, можно написать ORDER BY birthday:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY birthdayИ получить данные упорядоченные по дате рождения в хронологическом порядке:
Сортировка по дате рождения
id last_name first_name birthday 6 Иванов Алексей 1993-08-05 4 Иванова Светлана 1993-08-06 1 Иванов Дмитрий 1996-12-11 7 Процук Алена 1997-02-28 3 Шевченко Тимур 1998-04-27 А если в конструкции ORDER BY после имени столца написать DESC, то данные будут отсортированы в обратном порядке — свежие даты выше:
Сортировка по дате рождения в обратном порядке
id last_name first_name birthday 3 Шевченко Тимур 1998-04-27 7 Процук Алена 1997-02-28 1 Иванов Дмитрий 1996-12-11 4 Иванова Светлана 1993-08-06 6 Иванов Алексей 1993-08-05 Более того при сортировке данных по нескольким столцам, мы можем для разных столцов указывать разные направления сортировки. Например ORDER BY last_name, birthday DESC:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 ORDER BY last_name, birthday DESCТогда данные будут сперва отсортированы в алфавитном порядке по фамилии, а уже внутри каждой фамилии по дате рождения в обратном порядке:
Сортировка по дате рождения в обратном порядке
id last_name first_name birthday 6 Иванов Алексей 1993-08-05 1 Иванов Дмитрий 1996-12-11 4 Иванова Светлана 1993-08-06 7 Процук Алена 1997-02-28 3 Шевченко Тимур 1998-04-27 Следующий урок
Урок 5. Ограничение и смещение
В этом уроке вы научитесь ограничивать итоговые результаты с помощью конструкции LIMIT и делать смещение с помощью OFFSET
Полный курс с практикой
- 57 уроков
- 261 задание
- Сертификат
- Поддержка преподавателя
- Доступ к курсу навсегда
- Можно в рассрочку
Сортировка данных в SQL (ORDER BY)
При выборке данных бывает важно получить их в определенном упорядоченном виде. Сортировка может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она так же является сортировкой по возрастанию или убыванию. Она так же может быть выполнена в любых направлениях – от А, до Я, и наоборот от Я, до А.
Суть процесса сортировки заключается к приведению последовательности к определенному порядку. Подробней о сортировки можно узнать в статье "Алгоритмы сортировки". Например, сортировка произвольной числовой последовательности по возрастанию:
должна привести к упорядоченной последовательности:
Аналогично, при сортировке по возрастанию строковых значений:
Иванов Иван, Петров Петр, Иванов Андрей
результат должен быть:
Иванов Андрей, Иванов Иван, Петров Петр
Здесь строка "Иванов Андрей" перешла в начало, так как сравнение строк производится посимвольно. Обе строки начинаются одинаковых символов "Иванов ". Так как символ "А" в слове "Андрей" идет раньше в алфавите, чем символ "И" в слове "Иван", то эта строка будет поставлена раньше.
Сортировка в запросе SQL
Для выполнения сортировки в строку запроса нужно добавить команду ORDER BY. После этой команды указывается поле, по которому производится сортировка.
Для примеров используем таблицу товаров goods:
num
(номер товара)title
(название)price
(цена)1 Мандарин 50 2 Арбуз 120 3 Ананас 80 4 Банан 40 Данные здесь уже упорядочены по столбцу "num". Теперь, построим запрос, который выведет таблицу с товарами, упорядоченными в алфавитном порядке:
SELECT * FROM goods ORDER BY titleSELECT * 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. Сортировка данных.
Для сортировки данных, получаемых в результате запроса в языке SQL используется ключевое слово ORDER BY. База данных (далее – БД) сортирует данные по указанному параметру по убыванию, либо по возрастанию, в зависимости от условия указанного в запросе (ASC / DESC – соответственно).
Мы также можем использовать более одной колонки при использовании элемента ORDER BY.
Данный запрос имеет следующий общий вид:
SELECT колонка1, колонка2 . колонкаN FROM имя_таблицы [WHERE условие] [ORDER BY колонка1, колонка2 . колонкаN] [ASC | DESC];Предположим, что у нас есть таблица developers, которая содержит следующие данные:
+----+-------------------+------------+------------+--------+ | ID | NAME | SPECIALTY | EXPERIENCE | SALARY | +----+-------------------+------------+------------+--------+ | 1 | Eugene Suleimanov | Java | 2 | 2500 | | 2 | Peter Romanenko | Java | 3 | 3500 | | 3 | Andrei Komarov | JavaScript | 3 | 2500 | | 4 | Konstantin Geiko | C# | 2 | 2000 | | 5 | Asya Suleimanova | UI/UX | 2 | 1800 | +----+-------------------+------------+------------+--------+Допустим, что нам необходимо упорядочить разработчиков по зарплате по возрастанию.
Для этого мы должны использовать следующую команду:mysql> SELECT * FROM developers ORDER BY SALARY ASC;После выполнения данного запроса, мы получим следующий результат:
+----+-------------------+------------+------------+--------+ | ID | NAME | SPECIALTY | EXPERIENCE | SALARY | +----+-------------------+------------+------------+--------+ | 5 | Asya Suleimanova | UI/UX | 2 | 1800 | | 4 | Konstantin Geiko | C# | 2 | 2000 | | 1 | Eugene Suleimanov | Java | 2 | 2500 | | 3 | Andrei Komarov | JavaScript | 3 | 2500 | | 2 | Peter Romanenko | Java | 3 | 3500 | +----+-------------------+------------+------------+--------+Или же мы хотим упорядочить разработчиков по имени по возрастанию.
Для этого нам необходимо выполнить следующий запрос:mysql> SELECT * FROM developers ORDER BY NAME ASC;Полученные результат будет иметь следующий вид:
+----+-------------------+------------+------------+--------+ | ID | NAME | SPECIALTY | EXPERIENCE | SALARY | +----+-------------------+------------+------------+--------+ | 3 | Andrei Komarov | JavaScript | 3 | 2500 | | 5 | Asya Suleimanova | UI/UX | 2 | 1800 | | 1 | Eugene Suleimanov | Java | 2 | 2500 | | 4 | Konstantin Geiko | C# | 2 | 2000 | | 2 | Peter Romanenko | Java | 3 | 3500 | +----+-------------------+------------+------------+--------+Мы также можем задать свой собственный прядок сортировки.
Для этого нам необходимо составить следующий запрос:mysql> SELECT * FROM developers ORDER BY (CASE SPECIALTY WHEN 'C#' THEN 1 WHEN 'Java' THEN 2 WHEN 'UI/UX' THEN 3 ELSE 10 END) ASC;После выполнения данного запроса мы получим следующий результат:
+----+-------------------+------------+------------+--------+ | ID | NAME | SPECIALTY | EXPERIENCE | SALARY | +----+-------------------+------------+------------+--------+ | 4 | Konstantin Geiko | C# | 2 | 2000 | | 1 | Eugene Suleimanov | Java | 2 | 2500 | | 2 | Peter Romanenko | Java | 3 | 3500 | | 5 | Asya Suleimanova | UI/UX | 2 | 1800 | | 3 | Andrei Komarov | JavaScript | 3 | 2500 | +----+-------------------+------------+------------+--------+На этом мы заканчиваем изучение способов сортировки данных, полученных в результате обработки SQL запроса.
В следующей статье мы рассмотрим группировку данных.Предыдущая запись
