ORDER BY в SQL: что это и как использовать
2026-02-21 22:24 Diff

#Руководства

  • 4 фев 2026
  • 0

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

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

Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.

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

Для решения таких задач в SQL используют оператор ORDER BY. В этой статье разберёмся, как он используется и какие нюансы важно учесть при работе с разными типами данных: числами, текстом и датами.

Содержание

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

В 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 — WHERE, GROUP BY, LIMIT и OFFSET. Они выполняются на разных этапах обработки запроса и по-разному влияют на результат, поэтому важно учитывать порядок их применения.

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

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

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 всегда должен идти после фильтрации (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 может использовать не только реальные столбцы таблицы, но и алиасы или вычисляемые выражения. Это расширяет возможности сортировки данных.

Алиас — это псевдоним столбца, заданный в 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.

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

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

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

SELECT name, salary FROM employees ORDER BY salary DESC;

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

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

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

idvalue
11002203942023-01-05515.02.20246Apple738banana931/12/2020

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

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

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

SELECT id, value FROM mixed_data ORDER BY value;idvalue1100515.02.2024
22042023-01-0573931/12/2020
398Apple6banana

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