Какие ключевые слова используются для сортировки в SQL
Что проверяют
Базовый SQL и понимание того, что порядок строк это часть контракта результата, а не свойство таблицы. Вопрос простой, но по нему хорошо видно, писали ли вы проверки на реальных данных. Следом обычно спрашивают, где окажутся NULL, как сортировать по нескольким колонкам в разные стороны и почему без сортировки порядок непредсказуем.
Как отвечать
Начните с основного и добавляйте детали:
ORDER BY: единственный способ задать порядок. Выполняется почти последним, послеWHERE,GROUP BYиHAVING, поэтому в нём уже доступны алиасы изSELECT;- направление:
ASCподразумевается по умолчанию,DESCпишется явно. Колонки применяются по очереди:ORDER BY dept ASC, salary DESC; NULLS FIRSTиNULLS LAST: в PostgreSQL и OracleNULLпо умолчанию считаются наибольшими, то есть идут в конце приASCи в начале приDESC. В MySQL такого синтаксиса нет,NULLтам наименьшие, обходной приём этоORDER BY col IS NULL, col;- ограничение выборки:
LIMITиOFFSETв PostgreSQL и MySQL, стандартноеOFFSET ... FETCH FIRST n ROWS ONLY,TOP nв SQL Server; - выражения: сортировать можно по вычисляемому значению или
CASE. Номер позиции (ORDER BY 2) работает, но ломается при правке списка колонок; COLLATE: порядок букв и учёт регистра задаёт правило сравнения,ORDER BY name COLLATE "C"даёт побайтовый порядок;OVER (ORDER BY ...): внутри оконной функции сортировка задаёт порядок расчёта, а не вывода, как вROW_NUMBER() OVER (PARTITION BY dept ORDER BY salary DESC).
Стоит добавить, что порядок из подзапроса или из части UNION не гарантируется, сортировать нужно внешний запрос.
Где спотыкаются
Считают, что без ORDER BY строки придут в порядке вставки или по первичному ключу. Автотест зеленеет месяцами, а потом падает: планировщик выбрал другой способ чтения.
Забывают про NULL и переносят привычку одной СУБД в другую. При переезде с MySQL на PostgreSQL пустые значения оказываются на противоположном конце выборки.
Сортируют числа, лежащие в текстовой колонке, и получают «10» перед «9». Нужно либо привести тип в запросе, либо чинить схему, а второе почти всегда правильнее.