Условие
Может ли ORDER BY приводить к уменьшению числа строк в результате выполнения?
Решение
Нет. ORDER BY — это только сортировка: меняет порядок строк, не отбрасывает и не добавляет ни одной.
Количество строк в результате определяется операциями над множеством строк:
WHERE— фильтр (может уменьшить).JOIN— соединение (может уменьшить и увеличить).GROUP BY+ агрегаты — схлопывание (уменьшает).DISTINCT— удаление дублей (уменьшает).HAVING— фильтр послеGROUP BY(уменьшает).LIMIT/FETCH— ограничение (уменьшает).UNION(безALL) — удаление дублей (уменьшает).
ORDER BY ни в одном диалекте SQL не отсеивает строки.
Где можно ошибиться
В реальных системах есть «псевдо-уменьшение»:
ORDER BY ... LIMIT n— отсечёт всё послеn-й строки. Но «обрезает» именноLIMIT, а неORDER BY.SELECT TOP n ... ORDER BYв SQL Server — то же самое: режетTOP, неORDER BY.
Подводные камни
- Думать, что
ORDER BY ... DISTINCT-эффект. Это разные операции:DISTINCTдубли удаляет,ORDER BY— нет. - Считать, что
ORDER BYбесплатен. Сортировка — этоO(n log n)и часто требует временной памяти/диска. На больших таблицах бывает узким местом. - Полагаться на порядок без
ORDER BY. В SQL без явногоORDER BYпорядок строк не определён, даже если «обычно» возвращается одинаковым.
Эталонный ответ
Нет.