Что такое оператор ORDER BY в SQL
Что проверяют
Базовый SQL, которым тестировщик пользуется каждый день, сверяя данные в интерфейсе с базой. За простым вопросом обычно идут уточнения: где в сортировке окажутся NULL, почему без ORDER BY порядок не гарантирован и как сортировка связана с пагинацией.
Как отвечать
ORDER BY задаёт порядок строк в результате запроса. Выполняется почти последним, после SELECT, поэтому в нём можно использовать псевдоним столбца, а в WHERE нельзя.
- направление:
ASCпо умолчанию,DESCпо убыванию. Направление пишется для каждого столбца отдельно: вORDER BY last_name, age DESCфамилия идёт по возрастанию; - несколько ключей: второй столбец работает только внутри одинаковых значений первого;
- что можно сортировать: столбцы, выражения (
ORDER BY price * qty), псевдонимы и номера столбцов изSELECT(ORDER BY 2, но это хрупко); - NULL: в PostgreSQL и Oracle NULL считается больше любого значения и при
ASCуходит в конец, в MySQL, SQL Server и SQLite наоборот, в начало. Явно управляют черезNULLS FIRSTиNULLS LAST(PostgreSQL, Oracle, SQLite), в MySQL через приёмORDER BY col IS NULL, col; - пагинация:
LIMITиOFFSETбез сортировки по уникальному ключу дают дубли и пропуски между страницами.
Для тестировщика это готовые тест-кейсы на сортировку в интерфейсе: одинаковые значения, пустые поля, регистр и буква «ё» (порядок зависит от collation), числа, сохранённые строкой ('10' окажется раньше '9'), даты. И отдельный вопрос: сортирует ли сервер весь набор или фронт упорядочивает только текущую страницу.
Где спотыкаются
Считают, что без ORDER BY строки придут в порядке вставки или по id. Часто так и выходит, но после обновлений, параллельного плана или смены индекса порядок меняется, и тест, завязанный на него, начинает мигать.
Ставят DESC один раз в конце и думают, что он действует на все столбцы.
Сортируют для пагинации по неуникальному полю, например по дате создания, и видят одну и ту же запись на двух страницах. Нужен добавочный ключ: ORDER BY created_at DESC, id DESC.