Вопрос по mysql, sqlite, postgresql, sql-server – Порядок возврата строк SQL

8

Я редко использовал SQL до недавнего времени, когда я начал использовать его ежедневно. Я замечаю, что если нет "заказа по" пункт используется:

When selecting part of a table the rows returned appear to be in the same order as they appear if I select the whole table The order of rows returned by a selecting from a join seemes to be determined by the left most member of a join.

Является ли это поведение стандартной вещью, на которую можно рассчитывать в самых распространенных базах данных (MySql, Oracle, PostgreSQL, Sqlite, Sql Server)? (Я даже не знаю, действительно ли можно рассчитывать на это в sqlite). Насколько строго соблюдается, если так (например, если кто-то использует «группировать по», будут ли у каждой группы такой порядок)?

Ваш Ответ

5   ответов
-1

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

Что касается этого:

If no ORDER BY clause is included in the query, the returned order of rows is undefined.

Не совсем верно - в каждой СУБД, над которой я когда-либо работал (Oracle, Informix, SQL Server, DB2 и т. Д.), Предложение DISTINCT также имеет тот же эффект, что и ORDER BY, поскольку поиск уникальных значений включает сортировку по определению.

EDIT (6/2/14):

Create a simple table

enter image description here

For DISTINCT and ORDER BY, both the plan and the cost is the same since it is ostensibly the same operation to be performed

enter image description here

enter image description here

And not surprisingly, the effect is thus the same

enter image description here

Error: User Rate Limit ExceededsometimesError: User Rate Limit ExceededORDER BYError: User Rate Limit Exceeded
Error: User Rate Limit ExceededvaluesError: User Rate Limit Exceeded
Error: User Rate Limit ExceededCREATE TABLE T(X INT);INSERT INTO T SELECT number%2 FROM master..spt_values;SELECT DISTINCT X FROM TError: User Rate Limit Exceededlike thisError: User Rate Limit Exceeded0,1,-1Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededhashError: User Rate Limit Exceeded
Error: User Rate Limit ExceededORDER BYError: User Rate Limit ExceededcannotError: User Rate Limit ExceededORDER.
3

ORDER BY предложение, вы можете выполнить один и тот же запрос 100 раз, пока база данных не изменяется, и получить один прогон посередине в другом порядке, чем другие. Фактически, каждый прогон может быть в другом порядке.

Одна из причин, по которой это может произойти, состоит в том, что если выбранный план включает в себя последовательное сканирование кучи таблицы, и уже выполняется последовательность операций кучи этой таблицы, ваш запрос начнет его сканирование в любой точке другой сканирование уже на, чтобы уменьшить необходимость доступа к диску.

Как указывалось в других ответах, если вы хотите получить данные в определенном порядке, укажите этот порядок. PostgreSQL будет учитывать запрошенный порядок при выборе плана и может использовать индекс, который предоставляет данные в этом порядке, если это окажется дешевле, чем получить строки другим способом и затем отсортировать их.

GROUP BY не дает гарантии заказа; PostgreSQLmight сортировать данные для группировки илиmight используйте хеш-таблицу и возвращайте строки в порядке числа, сгенерированного алгоритмом хеширования (т.е. довольно случайным образом). И это может измениться от одного пробега к другому.

9

ORDER BY, Если вы не включилиORDER BYвы говорите SQL Server:

I don't care what order you return the rows, just return the rows

Поскольку вам все равно, SQL Server решит, как вернуть строки, что, по его мнению, будет наиболее эффективным способом.right now (или в соответствии с последним временем, когда план для этого конкретного запроса был кэширован). Поэтому вы не должны полагаться на поведение, которое вы наблюдаете. Он может меняться от одного прогона запроса к другому, с изменениями данных, статистики, изменений индекса, пакетов обновлений, накопительных обновлений, обновлений и т. Д.

Error: User Rate Limit Exceeded
13

возвращаемый порядок строк не определен.

Хотя некоторые РСУБД будут возвращать строки в определенных порядках в некоторых ситуациях, даже если предложение ORDER BY опущено, на такое поведение никогда не следует полагаться.

11

оператор прямого выбора: несколько строк & gt ;, подраздел & quot; Общие правила & quot; из  Спецификация SQL-92:

4) If an <order by clause> is not specified, then the ordering of
   the rows of Q is implementation-dependent.
Error: User Rate Limit ExceededcursorsError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы