Как отсортировать данные по алфавиту в SQL
Что проверяют
Базовый ORDER BY знают все, поэтому смотрят на детали, из-за которых отчёт выходит неверным: NULL, регистр, кириллица и числа в текстовом поле. Следом часто просят отсортировать по нескольким полям или объяснить, почему фамилии на «Ё» стоят не на своём месте.
Как отвечать
Основа: ORDER BY name сортирует по возрастанию, ASC писать не обязательно, DESC разворачивает порядок. Несколько полей перечисляются через запятую, ORDER BY last_name, first_name DESC, и направление задаётся для каждого поля отдельно.
Дальше то, что отличает сильный ответ:
NULL: в PostgreSQL и OracleNULLсчитается больше любого значения и приASCуходит в конец, в MySQL и SQL Server наоборот, в начало. Порядок задаётся явно черезNULLS FIRSTиNULLS LAST, в MySQL такого синтаксиса нет, там пишутORDER BY name IS NULL, name;- collation: алфавитный порядок определяет не SQL, а правило сравнения столбца или базы. При побайтовом
"C"в PostgreSQL заглавные идут раньше строчных, латиница раньше кириллицы, а «ё» после «я». Для русского порядка нужна русская локаль базы или ICU-правило вродеCOLLATE "ru-RU-x-icu"; - регистр: в MySQL 8 collation по умолчанию
utf8mb4_0900_ai_ciне различает регистр, в PostgreSQL для этого пишутORDER BY lower(name); - числа в тексте: в
VARCHARстрока «10» стоит раньше «2», потому что сравнение идёт посимвольно. Помогает приведение типа,ORDER BY CAST(code AS INT); - мусор в данных: ведущие пробелы и невидимые символы уводят строку в начало.
TRIMлечит это на лету, но правильнее почистить сами данные.
Где спотыкаются
Надеются, что строки и так вернутся по порядку, раз вставлялись по алфавиту. Без ORDER BY в итоговом запросе порядок не гарантирован, а ORDER BY внутри подзапроса или CTE его тоже не гарантирует.
Сортируют по номеру колонки, ORDER BY 2. Это работает, но после добавления поля в SELECT запрос молча начинает сортировать по другому столбцу.
Проверяют сортировку на латинице и сдают отчёт с кириллическими фамилиями, где заглавные и строчные разъехались, а «Ё» оказалась вне алфавита. Прогоните запрос на реальных данных до отправки.