ORDER BY в SQL: что это и как использовать
Наводим порядок в данных и сортируем их по любым критериям.
При работе с базами данных часто требуется упорядочить в них информацию для её анализа или подготовки отчётов. Например, отсортировать данные по дате, стоимости, количеству, алфавиту или другим критериям.
Для решения таких задач в SQL используют оператор ORDER BY. В этой статье разберёмся, как он используется и какие нюансы важно учесть при работе с разными типами данных: числами, текстом и датами.
Содержание
- Что такое ORDER BY
- Как сортировать значения по возрастанию и убыванию
- Как сортировать результат запроса по нескольким столбцам
- Как ORDER BY используется с другими операторами SQL
- Как использовать ORDER BY с алиасами и выражениями
- Частые ошибки у новичков
Что такое ORDER BY в SQL
ORDER BY — оператор SQL для сортировки результатов запроса. Он упорядочивает строки по одному или нескольким столбцам, задавая порядок по возрастанию или убыванию.
В общем виде запрос с ORDER BY выглядит так:
SELECT column1, column2
FROM table_name
ORDER BY column1 [ASC|DESC];Разберём, что значит каждая строка:
- FROM table_name указывает на то, что данные будут взяты из таблицы table_name.
- SELECT выбирает конкретные столбцы, которые будут видны в результате. В примере это column1 и column2.
- ORDER BY column1 [ASC|DESC] — сортируем столбец column1 или по возрастанию — ASC, или по убыванию — DESC. В запросе требуется выбрать один из параметров для столбца.
Можно сортировать сразу по нескольким столбцам:
SELECT column1, column2
FROM table_name
ORDER BY column1 ASC, column2 DESC;Здесь мы сортируем column1 по возрастанию, а column2 по убыванию.
Разберём на примере. В таблице products хранится информация о товарах на складе. В ней четыре столбца: name — наименование товара, price — стоимость, quantity — количество и arrival_date — дата поставки.
| name | price | quantity | arrival_date |
|---|---|---|---|
| Наушники | 150 | 25 | 03.10.2025 |
| Кабель USB | 120 | 80 | 25.02.2025 |
| Чехол для телефона | 200 | 40 | 18.03.2025 |
| Зарядное устройство | 180 | 15 | 05.03.2025 |
| Переходник | 110 | 60 | 20.02.2025 |
Отсортируем товары в таблице по возрастанию цены — от самых дешёвых к самым дорогим. Для этого напишем SQL-запрос:
SELECT name, price
FROM products
ORDER BY price ACD;Разберём его построчно:
- FROM products — данные берутся из таблицы products.
- SELECT name, price — выбираем только имя и цену товара. Два оставшихся столбца — количество и дату поставки — не показываем.
- ORDER BY price ACD — выводим результаты, начиная с самых дешёвых товаров.
В результате выполнения запроса получим таблицу:
| name | price |
|---|---|
| Переходник | 110 |
| Кабель USB | 120 |
| Наушники | 150 |
| Зарядное устройство | 180 |
| Чехол для телефона | 200 |
Всё верно! Получился отсортированный по возрастанию стоимости список товаров.
Сортировка по возрастанию и убыванию
В SQL результаты запроса можно отсортировать либо по возрастанию (ASC), либо по убыванию (DESC). Например, в прошлом разделе мы сортировали товары от самого дешёвого к самому дорогому:
SELECT name, price
FROM products
ORDER BY price ASC; Если же вам требуется сортировка в обратную сторону, то используйте DESC:
SELECT name, price
FROM products
ORDER BY price DESC; В этом случае результат будет другим — от наибольшей цены к наименьшей:
| name | price |
|---|---|
| Чехол для телефона | 200 |
| Зарядное устройство | 180 |
| Наушники | 150 |
| Кабель USB | 120 |
| Переходник | 110 |
Если при использовании ORDER BY не указать направление сортировки, SQL применяет сортировку по возрастанию (ASC) по умолчанию.
Сортировка чисел
При сортировке числовых значений SQL упорядочивает строки от меньшего к большему (ASC) или от большего к меньшему (DESC).
Например, отсортируем товары по количеству в убывающем порядке:
SELECT name, quantity
FROM products
ORDER BY quantity DESC;Всё получилось:
| name | quantityprice |
|---|---|
| Кабель USB | 80 |
| Переходник | 60 |
| Чехол для телефона | 40 |
| Наушники | 25 |
| Зарядное устройство | 15 |
Сортировка строк
Строки сортируются по алфавиту, как в словаре. В большинстве SQL-систем заглавные буквы считаются меньше строчных, если не используется настройка COLLATE.
Направление сортировки задаётся стандартным способом:
- ASC — от А до Я в русском языке и от A к Z в английском.
- DESC — от Я до А и от Z к A.
Важно!
Если в одном столбце есть данные на английском и русском языке, то при сортировке по возрастанию англоязычные буквы и слова будут находиться в начале списка.
Рассмотрим на примере таблицы с товарами их сортировку по алфавиту в убывающем порядке (от Я к А):
SELECT name
FROM users
ORDER BY name DESC;| name | price |
|---|---|
| Чехол для телефона | 200 |
| Переходник | 110 |
| Наушники | 150 |
| Кабель USB | 120 |
| Зарядное устройство | 180 |
Сортировка дат
SQL сортирует даты и время в хронологическом порядке:
- ASC — от самых ранних к самым поздним;
- DESC — от самых поздних к самым ранним.
Отсортируем товары в таблице по дате поступления. Сделаем это в порядке возрастания:
SELECT name, arrival_date
FROM products
ORDER BY arrival_date ASC;| name | arrival_date |
|---|---|
| Переходник | 20.02.2025 |
| Кабель USB | 25.02.2025 |
| Зарядное устройство | 05.03.2025 |
| Наушники | 10.03.2025 |
| Чехол для телефона | 18.03.2025 |
Работа с NULL в сортировке
В SQL значение NULL — это не 0 и не пустая строка, а признак неизвестного значения. Поэтому при сортировке важно учитывать особенности его обработки, которые различаются в разных СУБД.
Например, в MySQL и SQL Server NULL считается наименьшим значением и при сортировке по возрастанию попадает в начало. В PostgreSQL, наоборот, NULL считается наибольшим.
Порядок вывода NULL можно контролировать. В PostgreSQL для этого используются конструкции NULLS FIRST и NULLS LAST.
Например, запрос:
SELECT name, salary
FROM employees
ORDER BY salary DSC NULLS LAST;гарантирует, что записи с NULL в столбце salary при сортировке по убыванию окажутся в конце. NULLS FIRST работает наоборот и выводит их первыми.
Сортировка по нескольким столбцам
Иногда сортировки по одному столбцу недостаточно. В таких случаях используют многоколоночную сортировку — порядок строк определяется сразу по нескольким полям.
SQL применяет такую сортировку последовательно, слева направо:
- сначала сравниваются значения столбца, указанного первым в ORDER BY;
- если значения равны, применяется сортировка по следующему столбцу;
- далее — по каждому следующему столбцу в списке.
Посмотрим на примере работы с таблицей employees, которая содержит три поля: name (имя сотрудника), department (название подразделения компании) и salary (размер заработной платы).
| name | department | salary |
|---|---|---|
| Анна | Маркетинг | 80 000 |
| Дмитрий | IT | 150 000 |
| Ольга | HR | 70 000 |
| Сергей | IT | 120 000 |
| Мария | Маркетинг | 95 000 |
| Иван | HR | 90 000 |
Сейчас строки расположены хаотично. Отсортируем их сначала по названию отдела в алфавитном порядке, а затем по зарплате — от большей к меньшей:
SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;Результат выполнения запроса:
| name | department | salary |
|---|---|---|
| Иван | HR | 90 000 |
| Ольга | HR | 70 000 |
| Дмитрий | IT | 150 000 |
| Сергей | IT | 120 000 |
| Мария | Маркетинг | 95 000 |
| Анна | Маркетинг | 80 000 |
Всё получилось. Данные сначала отсортированы по названию отдела, а затем по размеру заработной платы.
ORDER BY и другие операторы SQL
Оператор ORDER BY работает вместе с другими конструкциями SQL — WHERE, GROUP BY, LIMIT и OFFSET. Они выполняются на разных этапах обработки запроса и по-разному влияют на результат, поэтому важно учитывать порядок их применения.
Взаимодействие с WHERE
WHERE фильтрует строки по заданным условиям до применения сортировки. Сначала SQL отбирает только подходящие записи, а затем упорядочивает их с помощью ORDER BY. Поэтому ORDER BY всегда размещают после WHERE.
Вернёмся к таблице с сотрудниками. Выберем из неё тех, кто работает в HR, и отсортируем их в порядке убывания зарплаты:
SELECT name, salary
FROM employees
WHERE department = 'HR'
ORDER BY salary DESC;| name | salary |
|---|---|
| Иван | 90 000 |
| Ольга | 70 000 |
Взаимодействие с LIMIT и OFFSET
LIMIT ограничивает количество возвращаемых строк, а OFFSET пропускает заданное число записей в начале отсортированного результата. Оба оператора применяются после сортировки.
Напишем запрос к таблице с сотрудниками:
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3 OFFSET 2;Результат выполнения:
| name | salary |
|---|---|
| Мария | 95 000 |
| Иван | 90 000 |
| Анна | 80 000 |
Что мы сделали? Сначала отсортировали всех сотрудников по зарплате от высокой к низкой. Затем указали, что требуется пропустить первых двух сотрудников с самой высокой зарплатой (OFFSET 2) и вывести следующие 3 строки (LIMIT 3).
Частые ошибки совместного использования ORDER BY и других конструкций
Напомним, что ORDER BY всегда должен идти после фильтрации (WHERE) и группировки (GROUP BY), но до ограничения количества строк (LIMIT) или их пропуска (OFFSET).
При нарушении порядка операторов в SQL-запросе возникают различные ошибки. Разберём самые частые из них.
Использование ORDER BY до WHERE.
Ошибочный запрос:
SELECT name, salary
FROM employees
ORDER BY salary DESC
WHERE department = 'IT';В результате получим синтаксическую ошибку:
syntax error at or near "WHERE"
Правильный вариант:
SELECT name, salary
FROM employees
WHERE department = 'IT'
ORDER BY salary DESC;Использование ORDER BY после LIMIT.
Предположим, что нам требуется выбрать трёх сотрудников с самыми высокими зарплатами из таблицы employees.
Неправильный запрос с размещением ORDER BY после LIMIT:
SELECT *
FROM (
SELECT name, salary
FROM employees
LIMIT 3
) sub
ORDER BY salary DESC;Результат выполнения:
| name | salary |
|---|---|
| Дмитрий | 150 000 |
| Анна | 80 000 |
| Ольга | 70 000 |
Почему результат неверный:
- внутренний запрос с LIMIT 3 берёт первые три строки из исходной таблицы, где данные находятся в произвольном порядке;
- внешний запрос с ORDER BY сортирует только три строки, а не всю таблицу.
В результате сотрудники с самыми высокими зарплатами не попали в выборку.
Правильный вариант запроса:
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;Итоговый результат:
| name | salary |
|---|---|
| Дмитрий | 150 000 |
| Сергей | 120 000 |
| Мария | 90 000 |
Использование ORDER BY с алиасами и выражениями
Оператор ORDER BY может использовать не только реальные столбцы таблицы, но и алиасы или вычисляемые выражения. Это расширяет возможности сортировки данных.
Сортировка по алиасу
Алиас — это псевдоним столбца, заданный в SELECT с помощью ключевого слова AS. Он создаёт виртуальный столбец во временном результате запроса и может хранить в нём результаты промежуточных вычислений. Алиасы упрощают чтение запроса и позволяют ссылаться на вычисленные значения при сортировке и других действиях с базой данных.
Например, отсортируем сотрудников по годовой зарплате. Для этого напишем запрос:
SELECT name, salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;В нём создаётся алиас annual_salary, которого нет в исходной таблице. Он хранит значение годовой зарплаты, полученное умножением salary на 12. Этот столбец формируется только в результате запроса и не сохраняется в исходной таблице employees.
В завершение с помощью ORDER BY и алиаса сотрудники сортируются по годовой зарплате.
| name | annual_salary |
|---|---|
| Дмитрий | 1 800 000 |
| Сергей | 1 440 000 |
| Мария | 1 140 000 |
| Иван | 1 080 000 |
| Анна | 960 000 |
| Ольга | 840 000 |
Сортировка по вычисляемым значениям
В ORDER BY можно использовать вычисляемые выражения напрямую, без создания алиаса. Это удобно, когда требуется сортировка по результату расчёта, но сам вычисленный столбец не нужно выводить.
Например, можно отсортировать сотрудников по годовой зарплате, не отображая её в выборке:
SELECT name, salary
FROM employees
ORDER BY salary * 12 DESC;Получим таблицу:
| name | department | salary |
|---|---|---|
| Дмитрий | IT | 150 000 |
| Сергей | IT | 120 000 |
| Мария | Маркетинг | 95 000 |
| Иван | HR | 90 000 |
| Анна | Маркетинг | 80 000 |
| Ольга | HR | 70 000 |
Запрос вычисляет значение salary * 12 для каждой строки и сортирует результаты. Несмотря на то, что в SELECT выводится месячная зарплата, сортировка выполняется именно по годовой заработной плате. Так как умножение на 12 не меняет относительный порядок значений, в данном случае результат эквивалентен сортировке по salary DESC.
Основные ошибки при использовании ORDER BY
Новички, только осваивающие SQL, часто совершают ошибки, которые приводят к неожиданным результатам или неверной сортировке данных. Рассмотрим основные из них.
Ожидание изменения порядка строк в исходной таблице
Распространённая ошибка — считать, что ORDER BY меняет порядок хранения строк в таблице. Это не так. Оператор определяет только порядок строк в результате запроса.
Представим запрос:
SELECT name, salary
FROM employees
ORDER BY salary DESC;После его выполнения employees остаётся без изменений. СУБД формирует отсортированный результат во временной таблице в оперативной памяти. Она существует только на время выполнения и обработки запроса, после чего удаляется.
Ошибки с типами данных
Сортировка данных с разными типами может давать неожиданный результат. Причина в том, что СУБД автоматически приводит значения к одному типу, и эти правила не всегда очевидны.
Представим таблицу mixed_data с двумя столбцами:
| id | value |
|---|---|
| 1 | 100 |
| 2 | 20 |
| 3 | 9 |
| 4 | 2023-01-05 |
| 5 | 15.02.2024 |
| 6 | Apple |
| 7 | 3 |
| 8 | banana |
| 9 | 31/12/2020 |
Столбец value содержит разные типы данных:
- числовые значения;
- даты в разных форматах;
- произвольные строки.
Попробуем отсортировать по второму столбцу:
SELECT id, value
FROM mixed_data
ORDER BY value;| id | value |
|---|---|
| 1 | 100 |
| 5 | 15.02.2024 |
| 2 | 20 |
| 4 | 2023-01-05 |
| 7 | 3 |
| 9 | 31/12/2020 |
| 3 | 9 |
| 8 | Apple |
| 6 | banana |
Здесь сортировка значений идёт посимвольно, как в строках. Связано это с тем, что SQL не определяет тип каждого значения, а решает что тип столбца — текстовый. Поэтому используется лексикографическая сортировка по отдельным символам:
- 100 и 15.02.2024 начинаются с 1; при сравнении второго символа 0 меньше 5, поэтому 100 выводится раньше.
- 20 и 2023-01-05 начинаются с 2; но строка 20 короче и полностью совпадает с началом второй, поэтому 20 идёт первой.
- 3 и 31/12/2020 начинаются с 3; строка 3 заканчивается раньше, поэтому она располагается раньше.
- 9 идёт после всех строк, начинающихся с 1, 2 и 3, так как 9 больше этих символов.
- Строки с буквами располагаются после чисел, так как цифры имеют меньшие коды символов;
- Apple идёт раньше banana, потому что буквы в заглавном регистре идут раньше строчных.
С точки зрения SQL всё корректно. С точки зрения анализа данных — путаница. Поэтому всегда важно учитывать тип данных в таблице.
Что запомнить
- ORDER BY не изменяет порядок хранения данных в таблице, он сортирует только результат запроса.
- По умолчанию сортировка выполняется по возрастанию (ASC).
- Можно сортировать по нескольким столбцам, по алиасам или вычисляемым выражениям.
- ORDER BY работает с различными типами данных: числа, строки, даты.
- Результат сортировки может зависеть от регистра, кодировки и наличия NULL.
- ORDER BY всегда должен идти после фильтрации (WHERE) и группировки (GROUP BY), но до ограничения количества строк (LIMIT) или их пропуска (OFFSET).
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!
Data Science с нуля: пробуем профессии на практике за 5 дней
Вы разберётесь в трёх главных направлениях data science: машинном обучении, разработке на Python и визуализации данных. Решите, какая сфера вам ближе, и выполните 4 реальные задачи с данными.
Пройти бесплатно

