Как отсортировать данные в SQL
QASQLбазы данныхинженерия тестированиясортировка
Что проверяют
Базовый синтаксис плюс детали, о которых вспоминают не все: пустые значения, несколько ключей, устойчивость порядка и цена сортировки.
Как отвечать
Сортировка задаётся ORDER BY с направлением у каждого ключа:
select name, salary, hired_at
from employees
order by salary desc, hired_at asc, id;Что стоит назвать сверх синтаксиса:
- несколько ключей применяются по очереди: второй разрешает ничьи первого;
- пустые значения: в PostgreSQL по умолчанию они идут последними при возрастании и первыми при убывании, и это меняется через
NULLS FIRSTиNULLS LAST. В других базах умолчание своё, поэтому при переносе запросов порядок может измениться; - устойчивость: если ключи не задают порядок однозначно, строки с одинаковыми значениями могут возвращаться в разном порядке между запусками. Поэтому в пагинации всегда добавляют уникальный ключ последним, иначе строки будут прыгать между страницами;
- регистр и язык: текстовая сортировка зависит от правил сравнения, и «ё» с заглавными буквами могут вести себя неожиданно;
- сортировка по выражению возможна (
order by lower(name)), но тогда обычный индекс не поможет, нужен индекс по выражению; - цена: сортировка большого результата требует памяти, а при нехватке уходит на диск. Индекс с подходящим порядком колонок позволяет получить данные уже отсортированными;
- пагинация:
limitс большимoffsetзаставляет базу прочитать и выбросить всё предыдущее. На больших выборках переходят на пагинацию по последнему значению ключа.
Где спотыкаются
Сортируют без уникального ключа и получают дубли и пропуски при листании страниц.
Забывают про пустые значения и удивляются, почему они оказались сверху.
Сортируют по выражению и теряют индекс, не замечая просадки.