В предыдущей статье цикла вы освоили базовые команды SELECT и FROM и уже можете написать элементарный запрос к базе. В этой мы продолжим изучение английского (зачёркнуто) SQL и выучим ещё три слова: ORDER BY, ASC и DESC.
Если вы не знаете английский – можно открыть онлайн переводчик и найти перевод:
- ORDER BY – упорядочить (отсортировать) по;
- ASC – (сокращение от ascending – восходящий) порядок то есть сортировка от меньшего к большему (0, 1, 2, 3 .. ) в случае сортировки слов – по алфавиту (А -> Я);
- DESC – (сокращение от descending – нисходящий) порядок то есть сортировка от большего к меньшему (100, 99, 98 …). Слова в этом случае сортируются в порядке обратном алфавитному (Я -> А).
Как мы можем использовать эти ключевые слова в написании запросов? Например, так:
SELECT name, score
FROM students
ORDER BY name ASC;
Если перевести запрос с английского на русский получим:
ВЫБЕРИ имя и оценку
ИЗ ТАБЛИЦЫ студентов
УПОРЯДОЧИВ ПО имени ПО ВОЗРАСТАНИЮ;
Выполним этот запрос получим следующий результат:
|------------------|-------|
| name | score |
|------------------|-------|
| Илья Краснов | 3 |
| Марина Кузина | 4 |
| Сергей Петров | 5 |
| Татьяна Говорова | 5 |
Как видите мы получили список студентов в алфавитном порядке. Выполним ещё задачу – отсортируем список студентов так чтобы в начале были студенты с более высокими оценками. Для этого напишем запрос:
SELECT name, score FROM students ORDER BY score DESC;
|------------------|-------|
| name | score |
|------------------|-------|
| Сергей Петров | 5 |
| Татьяна Говорова | 5 |
| Марина Кузина | 4 |
| Илья Краснов | 3 |
Как видите порядок записей изменился – в начале списка отличники Сергей и Татьяна, а Илья со своей тройкой оказался внизу списка. Уделим ещё пару минут нашим отличникам. Они оба имеют оценку 5, значит при выполнении нашего запроса с сортировкой обе записи имеют равный приоритет и то что Сергей оказался выше Татьяны – дело случая. База данных не гарантирует порядок строк кроме того который явно указан в запросе. Если нам принципиально чтобы студенты с равными оценками были упорядочены по имени придется уточнить запрос следующим образом:
SELECT name, score FROM students ORDER BY score DESC, name ASC;
В этом запросе мы прописали что хотим получить данные отсортированные по убыванию оценки, а в случае если оценки равны – отсортировать такие строки по имени. Таким запросом мы гарантируем порядок выдачи строк вне зависимости от настроения базы данных.
Таким образом вы знаете уже пять слов из лексикона SQL и можете выполнить задания 3 и 9 на SQLtest.online
Следующий урок можно найти здесь а вопросы по теме задать можно тут.
При выполнении SELECT запроса, строки по умолчанию
возвращаются в неопределённом порядке. Фактический порядок строк в этом случае
зависит от плана соединения и сканирования, а также от порядка расположения
данных на диске, поэтому полагаться на него нельзя. Для упорядочивания записей
используется конструкция ORDER BY.
Общая структура запроса с оператором ORDER BY
SELECT поля_таблиц FROM наименование_таблицы WHERE ... ORDER BY столбец_1 [ASC | DESC][, столбец_n [ASC | DESC]]Где ASC и DESC — направление сортировки:
- ASC — сортировка по возрастанию (по умолчанию)
- DESC — сортировка по убыванию
Например, выведем названия авиакомпаний в алфавитном порядке из таблицы Company:
SELECT name FROM Company ORDER BY name;Сортировка по возрастанию и убыванию для основных типов
Сортировка по нескольким столбцам
Для сортировки результатов по двум или более столбцам их следует указывать
через запятую....ORDER BY столбец_1 [ASC | DESC], столбец_2 [ASC | DESC];Данные будут сортироваться по первому столбцу, но в случае если попадаются несколько записей с совпадающими значениями в первом столбце,
то они сортируются по второму столбцу. Количество столбцов, по которым можно отсортировать, не ограничено.Правило сортировки применяется только к тому столбцу, за которым оно следует.
ORDER BY столбец_1, столбец_2 DESC
не то же самое, что
ORDER BY столбец_1 DESC, столбец_2 DESC
Выведем информацию о полётах, отсортированную по городу вылета самолёта в порядке возрастания и по городу прибытия в аэропорт в порядке убывания, из таблицы Trip:
SELECT DISTINCT town_from, town_to FROM Trip ORDER BY town_from, town_to DESC;В данном примере в начале записи сортируются по полю town_from. Затем отрабатывает обратная сортировка по полю town_to для групп строк, у которых в столбце town_from одинаковое значение.
Демонстрация работы сортировки
При выборке данных бывает важно получить их в определенном упорядоченном виде. Сортировка может быть выполнена по любым полям с любым типом данных. Это может быть сортировка по возрастанию или убыванию для числовых полей. Для символьных (текстовых) полей это может быть сортировка в алфавитном порядке, хотя по сути, она так же является сортировкой по возрастанию или убыванию. Она так же может быть выполнена в любых направлениях – от А, до Я, и наоборот от Я, до А.
Суть процесса сортировки заключается к приведению последовательности к определенному порядку. Подробней о сортировки можно узнать в статье «Алгоритмы сортировки». Например, сортировка произвольной числовой последовательности по возрастанию:
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
В этом учебном материале вы узнаете, как использовать 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. За ней следует имя поля, по которому происходит сортировка:
SELECT
id,
username,
created_at
FROM users ORDER BY username;
| id | username |
|---|---|
|
12 |
Abelardo58 |
|
33 |
Alanna99 |
|
58 |
Alena17 |
|
39 |
Alfonzo_Lehner |
|
44 |
Amely1 |
|
… |
View on DB Fiddle
Такой запрос вернет всю информацию о пользователях, отсортированную по username. Если порядок не указан, то сортировка происходит по возрастанию ASC.
Сортировка подразумевает сравнение значений между собой. По какому принципу база данных сортирует строки username, как в примере выше? Самый распространенный способ — лексикографический порядок, то есть по алфавиту.
База данных знает, как сравнивать не только числа, но и строки, и даты. Сортировка по датам — крайне частая операция, выглядит она идентично любой другой сортировке:
SELECT
id,
username,
created_at
FROM users ORDER BY created_at;
| id | username | created_at |
|---|---|---|
|
16 |
Davonte78 |
2022-06-13T20:45:36.590Z |
|
61 |
Carmela.Raynor42 |
2022-06-13T20:49:36.072Z |
|
67 |
Gertrude_Hand29 |
2022-06-13T20:49:39.486Z |
|
46 |
Edd_Harris |
2022-06-13T20:58:22.247Z |
|
13 |
Tina_Huels |
2022-06-13T20:59:54.222Z |
|
… |
View on DB Fiddle
Здесь мы отсортировали пользователей по дате создания в прямом порядке, то есть по возрастанию.
