Для чего нужен ORDER BY в SQL
Что проверяют
Знаете ли вы главное: без ORDER BY порядок строк в результате не гарантирован. Для C#-разработчика вопрос обычно продолжается в сторону EF Core: как сортировка переводится из LINQ и почему пагинация без неё ломается.
Как отвечать
ORDER BY задаёт порядок строк итогового результата и логически выполняется почти последним, после WHERE, GROUP BY и SELECT. Поэтому в нём можно ссылаться на псевдонимы из SELECT.
- направление:
ASCпо умолчанию,DESCпо убыванию, задаётся для каждого столбца отдельно:ORDER BY Department, Salary DESC; - выражения: сортировать можно по вычисляемому значению или по
CASE, чтобы задать свой порядок статусов; - NULL: в SQL Server при
ASCони идут первыми, в PostgreSQL последними. В PostgreSQL и Oracle естьNULLS FIRSTиNULLS LAST, в SQL Server такого синтаксиса нет, выручаетCASE; - пагинация: в SQL Server
OFFSET ... FETCHбезORDER BYне скомпилируется; - строки: порядок зависит от collation, одна выборка может сортироваться по-разному в разных базах.
В EF Core сортировка пишется через OrderBy, OrderByDescending и ThenBy. Повторный OrderBy не добавляет второй ключ, а заменяет первый. На Skip и Take без OrderBy EF Core пишет предупреждение в лог, и страницы начинают терять или дублировать записи.
Про производительность: если есть индекс в порядке сортировки, база читает его и обходится без отдельного шага. Иначе в плане появляется оператор Sort, который на больших выборках уходит на диск в tempdb.
Где спотыкаются
Считают, что без ORDER BY строки придут «в порядке вставки» или по первичному ключу. Часто так и выглядит, но это случайность, которая меняется вместе с планом запроса.
Сортируют для пагинации по неуникальному полю, например по дате. Строки с одинаковой датой перемешиваются между страницами, нужен добавочный ключ: ORDER BY CreatedAt, Id.
Вызывают ToList() до OrderBy и сортируют в памяти приложения всю таблицу вместо того, чтобы отдать сортировку базе.