Скидка до 55% и 3 курса в подарок 2 дня 13 :30 :09 Выбрать курс
Код
#Руководства

ORDER BY в SQL: что это и как использовать

Наводим порядок в данных и сортируем их по любым критериям.

Иллюстрация: Оля Ежак для Skillbox Media

При работе с базами данных часто требуется упорядочить в них информацию для её анализа или подготовки отчётов. Например, отсортировать данные по дате, стоимости, количеству, алфавиту или другим критериям.

Для решения таких задач в 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 — дата поставки.

namepricequantityarrival_date
Наушники1502503.10.2025
Кабель USB1208025.02.2025
Чехол для телефона2004018.03.2025
Зарядное устройство1801505.03.2025
Переходник1106020.02.2025

Отсортируем товары в таблице по возрастанию цены — от самых дешёвых к самым дорогим. Для этого напишем SQL-запрос:

SELECT name, price
FROM products
ORDER BY price ACD;

Разберём его построчно:

  • FROM products — данные берутся из таблицы products.
  • SELECT name, price — выбираем только имя и цену товара. Два оставшихся столбца — количество и дату поставки — не показываем.
  • ORDER BY price ACD — выводим результаты, начиная с самых дешёвых товаров.

В результате выполнения запроса получим таблицу:

nameprice
Переходник110
Кабель USB120
Наушники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; 

В этом случае результат будет другим — от наибольшей цены к наименьшей:

nameprice
Чехол для телефона200
Зарядное устройство180
Наушники150
Кабель USB120
Переходник110

Если при использовании ORDER BY не указать направление сортировки, SQL применяет сортировку по возрастанию (ASC) по умолчанию.

Сортировка чисел

При сортировке числовых значений SQL упорядочивает строки от меньшего к большему (ASC) или от большего к меньшему (DESC).

Например, отсортируем товары по количеству в убывающем порядке:

SELECT name, quantity
FROM products
ORDER BY quantity DESC;

Всё получилось:

namequantityprice
Кабель USB
80
Переходник60
Чехол для телефона40
Наушники25
Зарядное устройство15

Сортировка строк

Строки сортируются по алфавиту, как в словаре. В большинстве SQL-систем заглавные буквы считаются меньше строчных, если не используется настройка COLLATE.

Направление сортировки задаётся стандартным способом:

  • ASC — от А до Я в русском языке и от A к Z в английском.
  • DESC — от Я до А и от Z к A.

Важно!

Если в одном столбце есть данные на английском и русском языке, то при сортировке по возрастанию англоязычные буквы и слова будут находиться в начале списка.

Рассмотрим на примере таблицы с товарами их сортировку по алфавиту в убывающем порядке (от Я к А):

SELECT name
FROM users
ORDER BY name DESC;
nameprice
Чехол для телефона200
Переходник
110
Наушники150
Кабель USB120
Зарядное устройство180

Сортировка дат

SQL сортирует даты и время в хронологическом порядке:

  • ASC — от самых ранних к самым поздним;
  • DESC — от самых поздних к самым ранним.

Отсортируем товары в таблице по дате поступления. Сделаем это в порядке возрастания:

SELECT name, arrival_date
FROM products
ORDER BY arrival_date ASC;
namearrival_date
Переходник20.02.2025
Кабель USB25.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 (размер заработной платы).

namedepartmentsalary
АннаМаркетинг80 000
ДмитрийIT150 000
ОльгаHR70 000
СергейIT120 000
МарияМаркетинг95 000
ИванHR90 000

Сейчас строки расположены хаотично. Отсортируем их сначала по названию отдела в алфавитном порядке, а затем по зарплате — от большей к меньшей:

SELECT name, department, salary
FROM employees
ORDER BY department ASC, salary DESC;

Результат выполнения запроса:

namedepartmentsalary
ИванHR90 000
ОльгаHR70 000
ДмитрийIT150 000
СергейIT120 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;
namesalary
Иван90 000
Ольга70 000

Взаимодействие с LIMIT и OFFSET

LIMIT ограничивает количество возвращаемых строк, а OFFSET пропускает заданное число записей в начале отсортированного результата. Оба оператора применяются после сортировки.

Напишем запрос к таблице с сотрудниками:

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3 OFFSET 2;

Результат выполнения:

namesalary
Мария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;

Результат выполнения:

namesalary
Дмитрий150 000
Анна80 000
Ольга70 000

Почему результат неверный:

  • внутренний запрос с LIMIT 3 берёт первые три строки из исходной таблицы, где данные находятся в произвольном порядке;
  • внешний запрос с ORDER BY сортирует только три строки, а не всю таблицу.

В результате сотрудники с самыми высокими зарплатами не попали в выборку.

Правильный вариант запроса:

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;

Итоговый результат:

namesalary
Дмитрий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 и алиаса сотрудники сортируются по годовой зарплате.

nameannual_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;

Получим таблицу:

namedepartmentsalary
ДмитрийIT150 000
СергейIT120 000
МарияМаркетинг95 000
ИванHR90 000
АннаМаркетинг80 000
ОльгаHR70 000

Запрос вычисляет значение salary * 12 для каждой строки и сортирует результаты. Несмотря на то, что в SELECT выводится месячная зарплата, сортировка выполняется именно по годовой заработной плате. Так как умножение на 12 не меняет относительный порядок значений, в данном случае результат эквивалентен сортировке по salary DESC.

Основные ошибки при использовании ORDER BY

Новички, только осваивающие SQL, часто совершают ошибки, которые приводят к неожиданным результатам или неверной сортировке данных. Рассмотрим основные из них.

Ожидание изменения порядка строк в исходной таблице

Распространённая ошибка — считать, что ORDER BY меняет порядок хранения строк в таблице. Это не так. Оператор определяет только порядок строк в результате запроса.

Представим запрос:

SELECT name, salary
FROM employees
ORDER BY salary DESC;

После его выполнения employees остаётся без изменений. СУБД формирует отсортированный результат во временной таблице в оперативной памяти. Она существует только на время выполнения и обработки запроса, после чего удаляется.

Ошибки с типами данных

Сортировка данных с разными типами может давать неожиданный результат. Причина в том, что СУБД автоматически приводит значения к одному типу, и эти правила не всегда очевидны.

Представим таблицу mixed_data с двумя столбцами:

idvalue
1100
220
39
42023-01-05
515.02.2024
6Apple
73
8banana
931/12/2020

Столбец value содержит разные типы данных:

  • числовые значения;
  • даты в разных форматах;
  • произвольные строки.

Попробуем отсортировать по второму столбцу:

SELECT id, value
FROM mixed_data
ORDER BY value;
idvalue
1100
515.02.2024
220
42023-01-05
73
931/12/2020
39
8Apple
6banana

Здесь сортировка значений идёт посимвольно, как в строках. Связано это с тем, что 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 реальные задачи с данными.

Пройти бесплатно



Попробуйте data science на бесплатном курсе
Пройдите курс по data science и изучите 3 направления в работе с данными. Решите, в какой сфере хотите развиваться дальше, и получите ценные подарки.
Пройти курс →
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована