В этом учебном материале вы узнаете, как использовать 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 в порядке возрастания.
При выполнении 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
. За ней следует имя поля, по которому происходит сортировка:
SELECT * FROM users ORDER BY username;
Такой запрос вернет всю информацию о пользователях, отсортированную по username
. Если порядок не указан, то сортировка происходит по возрастанию ASC
.
Сортировка подразумевает сравнение значений между собой. По какому принципу база данных сортирует строки username
, как в примере выше? Самый распространенный способ — лексикографический порядок, то есть по алфавиту.
База данных знает, как сравнивать не только числа, но и строки, и даты. Сортировка по датам — крайне частая операция, выглядит она идентично любой другой сортировке:
SELECT * FROM users ORDER BY created_at;
Здесь мы отсортировали пользователей по дате создания в прямом порядке, то есть по возрастанию.
Для сортировки данных, получаемых в результате запроса в языке 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 запроса.
В следующей статье мы рассмотрим группировку данных.
Ключевое слово ORDER BY
Ключевое слово ORDER BY используется для сортировки результирующего набора в порядке возрастания или убывания.
Ключевое слово ORDER BY по умолчанию сортирует записи в порядке возрастания.
Чтобы отсортировать записи в порядке убывания, используйте ключевое слово DESC.
Синтаксис с ORDER BY
SELECT column1, column2, …
FROM table_name
ORDER BY column1, column2, … ASC|DESC;
Демо база данных
Ниже приведен выбор из таблицы «Customers» в образце базы данных Northwind:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Пример ORDER BY
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers», отсортированных по столбцу «Country»:
Пример ORDER BY DESC
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers», отсортированных по убыванию столбца «Country»:
Пример ORDER BY несколько столбцов
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers»,
отсортированных по столбцу «Country» и «CustomerName».
Это означает, что он заказывает по стране, но если некоторые строки имеют одну и ту же страну, он заказывает их по имени клиента:
Пример 2 ORDER BY несколько столбцов
Следующая инструкция SQL выбирает всех клиентов из таблицы «Customers»,
отсортированных по возрастанию по столбцу «Country» и по убыванию по столбцу «CustomerName»:
Пример
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
Попробуйте сами »