← Назад к вопросам

Какой оператор отвечает за сортировку?

1.0 Junior🔥 171 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ORDER BY — оператор для сортировки в SQL

При тестировании приложений, которые работают с базами данных, я постоянно использую SQL оператор ORDER BY. Это основной инструмент для управления порядком результатов запроса. Рассмотрю его подробно.

Основной синтаксис

ORDER BY — это оператор в SQL, который сортирует результаты запроса по одной или нескольким колонкам.

SELECT * FROM users ORDER BY created_at ASC;
SELECT * FROM products ORDER BY price DESC;
SELECT * FROM orders ORDER BY customer_name ASC, created_at DESC;

ASC vs DESC

  • ASC (Ascending) — сортировка по возрастанию (по умолчанию)

    • Для чисел: 1, 2, 3, 10, 100
    • Для текста: A, B, C, Z (алфавитный порядок)
    • Для дат: старые даты раньше, новые позже
  • DESC (Descending) — сортировка по убыванию

    • Для чисел: 100, 10, 3, 2, 1
    • Для текста: Z, C, B, A (обратный алфавитный порядок)
    • Для дат: новые даты раньше, старые позже

Практические примеры из моей работы

Пример 1: Получить новые заказы сначала

SELECT id, customer_name, created_at, total_amount
FROM orders
ORDER BY created_at DESC
LIMIT 10;

Это выведет 10 последних заказов в обратном хронологическом порядке.

Пример 2: Получить самые дорогие товары

SELECT product_name, price, stock
FROM products
WHERE status = 'active'
ORDER BY price DESC;

Пример 3: Сортировка по нескольким колонкам

SELECT 
  last_name, 
  first_name, 
  email, 
  created_at
FROM users
ORDER BY last_name ASC, first_name ASC;

Сначала сортирует по фамилии, потом по имени (полезно для алфавитного списка).

Пример 4: Сортировка по номеру колонки

SELECT name, email, created_at
FROM users
ORDER BY 3 DESC;

Что проверять при тестировании ORDER BY

Когда я тестирую запросы с ORDER BY, я всегда проверяю:

  1. Правильность сортировки

    • Значения действительно в правильном порядке
    • Нет пропущенных или неправильно отсортированных элементов
  2. NULL значения

    • NULL значения в большинстве БД выводятся в конце для ASC
    • и в начале для DESC
  3. Case sensitivity (чувствительность к регистру)

    • На разных БД может отличаться результат
    • "abc", "ABC", "Abc" — какой порядок?
  4. Performance при сортировке больших таблиц

    • Есть ли индекс на колонке сортировки?
    • Сколько времени занимает запрос?
  5. Граничные случаи

    • Пустой результат (не должно быть ошибки)
    • Один элемент в результате
    • Дублирующиеся значения

ORDER BY с агрегирующими функциями

Часто я использую ORDER BY с GROUP BY:

SELECT 
  category, 
  COUNT(*) as product_count,
  AVG(price) as avg_price
FROM products
GROUP BY category
ORDER BY product_count DESC;

Выводит категории по количеству товаров (от больше к меньше).

Оптимизация: индексы

При тестировании производительности я проверяю:

SELECT * FROM orders ORDER BY created_at DESC;
CREATE INDEX idx_orders_created_at ON orders(created_at DESC);

NULLS FIRST / NULLS LAST (PostgreSQL)

В PostgreSQL можно явно указать, где должны быть NULL:

SELECT * FROM products ORDER BY price DESC NULLS LAST;
SELECT * FROM products ORDER BY price ASC NULLS FIRST;

Частые ошибки, которые я ловлю при тестировании

  1. Забытый ORDER BY — результаты выводятся в случайном порядке
  2. Неправильное направление (ASC вместо DESC или наоборот)
  3. Сортировка строк как чисел — "100" < "20" как строки
  4. Проблемы с NULL — неожиданное место NULL в результатах
  5. Performance — забыли индекс, запрос медленнее обычного

Тестирование ORDER BY в автотестах

def test_products_sorted_by_price():
    response = api.get('/products?sort=price&order=desc')
    products = response.json()
    prices = [p['price'] for p in products]
    assert prices == sorted(prices, reverse=True)

ORDER BY — это фундаментальный оператор SQL, который требует тщательного тестирования, особенно при работе с большими объёмами данных и критичными для бизнеса результатами.