УРОК 4 / 27· ≈ 30 мин

ORDER BY: сортируем результат

Порядок строк: ORDER BY

Важная деталь, которая удивляет новичков: без явной сортировки порядок строк в ответе не гарантирован. База может вернуть их в любом порядке — как ей удобнее. Если порядок важен (а он почти всегда важен), его задают разделом ORDER BY:

SELECT model, speed
FROM airplanes
ORDER BY speed;

Этот запрос отсортирует самолёты по скорости — от меньшей к большей.

По возрастанию и убыванию: ASC / DESC

  • ASC (ascending) — по возрастанию. Это вариант по умолчанию, его можно не писать.
  • DESC (descending) — по убыванию.
SELECT model, speed
FROM airplanes
ORDER BY speed DESC;   -- сначала самые быстрые

Сортировка по нескольким столбцам

Можно сортировать сразу по нескольким столбцам — через запятую. База сначала упорядочит по первому, а строки с одинаковым значением — по второму, и так далее:

SELECT airport_code, city, country
FROM airports
ORDER BY country, city;   -- по стране, внутри страны — по городу

Типичные ошибки

  • Надежда на порядок «по умолчанию». Без ORDER BY порядок строк не гарантирован. Сегодня самолёты пришли по коду, а завтра, после обновления данных, — вперемешку.
  • DESC действует только на свой столбец. В ORDER BY range, speed DESC по убыванию идёт только speed, а range — по возрастанию.
  • Числа, сохранённые текстом. Если число хранится как текст, сортировка идёт по буквам: '10' окажется раньше '9', потому что символ 1 меньше символа 9.
  • Пустые значения. При сортировке по возрастанию PostgreSQL ставит NULL в конец, по убыванию — в начало. Изменить это можно явно: ORDER BY actual_departure NULLS LAST.

Сортировать можно и по псевдониму из SELECT: SELECT speed AS kmh FROM airplanes ORDER BY kmh. Это работает, потому что ORDER BY выполняется после SELECT.

💡 Хитрость профи: если по основному столбцу есть одинаковые значения, добавьте в конец сортировки уникальный столбец (например, airplane_code или airport_code) — тогда порядок будет полностью однозначным каждый раз. В наших задачах так и делаем.

Например, у двух самолётов скорость 913 км/ч. Чтобы они всегда шли в одном и том же порядке, пишем ORDER BY speed DESC, airplane_code.

Практика

8
  1. Тест 1 — Как будут упорядочены строки, если в запросе нет ORDER BY?
  2. Тест 2 — Нужно: сначала самые дальнобойные самолёты, а при равной дальности — меньший код. Какой вариант верный?
  3. Задача 1 — Самолёты от быстрых к медленным
  4. Задача 2 — Самолёты по дальности
  5. Задача 3 — Самолёты по названию модели
  6. Задача 4 — Аэропорты по стране и городу
  7. Задача 5 — Аэропорты в обратном порядке
  8. Задача 6 — Сортировка по двум критериям

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

Зарегистрироваться и решитьВойти

Потренируйтесь в тренажёре

2

Задачи на ту же тему, но на другой базе — продажи магазина электроники. Хороший способ проверить, что тема понятна, а не просто запомнилась на примерах урока.

SELECT: выбираем столбцыСледующий урок: LIMIT и DISTINCT