SQL-Урок 3. Сортировка данных (ORDER BY)
В будущем нам может понадобиться рассортировать нашу выборку – в алфавитном порядке для текста или по возрастанию/убыванию – для цифровых значений. Для таких целей в SQL имеется специальный оператор ORDER BY.
SQL оператр ORDER BY может производить сортировку как от меньшего к большему, то есть по возрастанию, так и в обратном порядке — от большего к меньшему.
1. Сортировка выбранных данных
Давайте всю нашу таблицу рассортируем по сумме реализации продукции, а именно по столбцу Amount.
Run SQLSELECT * FROM Sumproduct ORDER BY Amount
Try it Yourself
Видим, что запрос рассортировал записи по росту в поле Amount. Обязательно нужно соблюдать последовательность расположения операторов, то есть оператор ORDER BY должен идти в самом конце запроса. В противном случае будет получено сообщение об ошибке.
Также, особенностью оператора ORDER BY является то, что он может сортировать данные по полю, которого мы не выбирали в запросе, то есть достаточно, чтобы оно вообще было в БД.
2. Сортировка по нескольким полям
Теперь посортируем наш пример дополнительно по еще одному полю. Пусть это будет поле City, отображающее место реализации продукции.
Run SQLSELECT * FROM Sumproduct ORDER BY Amount, City
Try it Yourself

Очередность сортировки будет зависеть от порядка расположения полей в запросе. То есть, в нашем случае сначала данные будут рассортированы по колонке Amount, а затем по City.
3. Направление сортировки
Несмотря на то, что по умолчанию оператор ORDER BY сортирует по возрастанию, мы можем также прописать сортировку значений по убыванию. Для этого в конце каждого поля проставляем оператор DESC (являющийся сокращением от слова DESCENDING).
Run SQLSELECT * FROM Sumproduct ORDER BY Amount DESC, City
Try it Yourself

В данном примере, значения в поле Amount были рассортированы по убыванию, а в поле City – по возрастанию. Оператор DESC применяется только для одного столбца, поэтому при необходимости его нужно прописывать после каждого поля, принимающего участие в сортировке.
- Изменение регистра букв в тексте
- Сумма прописью на украинском языке
- Поиск латиницы в кириллице и наоборот
- Транслитерация с украинского на английский
Сортировка
Данные в таблицах базы данных хранятся неупорядоченно. Выполнив один и тот же запрос несколько раз можно получить один и тот же результат, но строки результата будут отсортированы по-разному.
Для гарантированной сортировки строк нужно в конце SQL запроса добавить предложение ORDER BY . Например, получим информацию о магазинах, отсортированную по названию:
SELECT store_id, name FROM store ORDER BY name
| store_id | name |
|---|---|
| 900 | Big |
| 600 | Umi |
| 300 | Адалин |
| 301 | Адалин-family |
| . | . |
Чтобы отсортировать в обратном порядке, необходимо после поля для сортировки указать ключевое слово DESC (по умолчанию ASC — по возрастанию). Например отсортируем магазины по названию по убыванию:
SELECT store_id, name FROM store ORDER BY name DESC
| store_id | name |
|---|---|
| 800 | Универсам |
| 201 | Сатурн |
| 100 | Пионер |
| 500 | Март |
| 200 | Марс |
| . | . |
Иногда необходимо при сортировке разбить данные на какие-то группы, а потом отсортировать данные уже в рамках каждой группы. Например отсортируем сотрудников по должностям, а в рамках каждой должности по имени:
SELECT employee_id, rank_id, last_name FROM employee ORDER BY rank_id, last_name
| employee_id | rank_id | last_name |
|---|---|---|
| 8 | CEO | Корсаков |
| 7 | CHIEF | Вершинина |
| 1 | CHIEF | Иванов |
| 2 | CHIEF | Маккормик |
| 3 | CHIEF | Матвеева |
В общем случае столбцов для сортировки может быть сколько угодно.
Руководство по 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 запроса.
В следующей статье мы рассмотрим группировку данных.
Урок 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 задание
- Сертификат
- Поддержка преподавателя
- Доступ к курсу навсегда
- Можно в рассрочку
