SQL: Каков порядок по умолчанию запросов?

Каков порядок запроса по умолчанию, если нет ORDER BY используется?

4 ответа

Такого порядка нет. Взято с http://forums.mysql.com/read.php?21,239471,239688

  • Не зависит от порядка, когда отсутствует ORDER BY.

  • Всегда указывайте ORDER BY, если вы хотите конкретный заказ - в некоторых ситуациях движок может исключить ORDER BY из-за того, как он выполняет какой-то другой шаг.

  • ГРУППА ПО СИЛАМ ПОРЯДОК. (Это является нарушением стандарта. Этого можно избежать, используя ORDER BY NULL.)

SELECT * FROM tbl - это сделает "сканирование таблицы". Если в таблице никогда не было DELETEs/REPLACEs/UPDATEs, записи окажутся в порядке вставки, отсюда то, что вы наблюдали.

Если бы вы сделали тот же оператор с таблицей InnoDB, они были бы доставлены в порядке PRIMARY KEY, а не в INSERT. Опять же, это артефакт базовой реализации, а не то, от чего можно зависеть.

Там нет ни одного. В зависимости от того, что вы запрашиваете и как ваш запрос был оптимизирован, вы можете получить любой заказ. Нет даже гарантии, что два запроса, которые выглядят одинаково, будут возвращать результаты в одном и том же порядке: если вы не укажете его, вы не сможете на него положиться.

Я обнаружил, что SQL Server является почти случайным в порядке по умолчанию (в зависимости от возраста и сложности данных), что хорошо, так как заставляет вас указывать все порядок.

(Я смутно помню, что Oracle в этом отношении похож на SQL Server.)

MySQL по умолчанию выглядит упорядоченным по структуре записи на диске (которая может включать записи вне последовательности из-за удалений и оптимизаций), но изначально он часто вводит разработчиков в заблуждение, не прибегая к использованию предложений order by, поскольку данные по умолчанию выглядят как заказ первичного ключа, что не так!

Я был удивлен, обнаружив сегодня, что MySQL 5.6 и 4.1 неявно подчиняются записям суб-порядка, которые были отсортированы по столбцу с ограниченным разрешением в противоположном направлении. Некоторые из моих результатов имеют идентичные значения сортировки, и общий порядок непредсказуем. например, в моем случае это был отсортированный DESC по столбцу datetime, и некоторые записи были в одну секунду, поэтому их нельзя было явно упорядочить. На MySQL 5.6 они выбираются в одном порядке (порядок вставки), но в 4.1 они выбирают задом наперед! Это привело к очень досадной ошибке развертывания.

Я не нашел документации по этому изменению, но нашел заметки о неявном порядке групп в MySQL:

По умолчанию MySQL сортирует все запросы GROUP BY col1, col2, ... так, как если бы вы указали в запросе также ORDER BY col1, col2, ....

Тем не мение:

Полагаться на неявную сортировку GROUP BY в MySQL 5.5 не рекомендуется. Для достижения определенного порядка сортировки сгруппированных результатов предпочтительно использовать явное предложение ORDER BY.

Таким образом, в соответствии с другими ответами - никогда не полагайтесь на дефолт или неявное упорядочение в любой базе данных.

Порядок по умолчанию будет зависеть от индексов, используемых в запросе, и в каком порядке они используются. Он может меняться при изменении данных / статистики, и оптимизатор выбирает разные планы.

Если вы хотите данные в определенном порядке, используйте ORDER BY

Другие вопросы по тегам