2010-02-02 1 views
3

Предположим, у меня есть таблица:Что делать, когда выбирают данные из базы данных?

CREATE TABLE [tab] (
    [name] varchar, 
    [order_by] int 
) 

Есть 10 строк в таблице, и все строки имеют одинаковое значение для order_by (Скажем, это 0)

Если я тогда вопрос следующий SQL:

select * from [tab] order by [order_by] 

Какой порядок строк? Какой фактор определяет порядок строк в этом случае?

+1

только гадать: вставить заказ? – jinsungy

+1

@jinsungy: может быть, но этого также может и не быть. Это зависит от базы данных, каких индексов присутствуют, насколько велика таблица и т. Д. –

+2

Просто подсказка: не полагайтесь на неопределенное поведение. – mpen

ответ

4

В этом случае заказ отсутствует, так как вы не указали заказ.

6

Если ваши колонки, которые вы заказываете, не имеют никаких изменений, чем нет гарантированного заказа.

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

8

Не определено. База данных может выплевывать их в любом порядке, который она выбирает, и она может даже изменить порядок между запросами, если он будет похож на него (вероятно, это не будет сделано, но вы не должны полагаться на согласованный порядок).

+4

Прямо на деньги. Порядок не определен по определению :-). Никогда не принимайте какой-либо определенный порядок. –

1

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

+4

, который будет не всегда случаться, и вы не должны полагаться на него. – HLGEM

0

Обычно у вашей таблицы есть столбец с идентификатором PKey. Если это так, то это будет порядок в SQL Server 2008. К сожалению, я столкнулся с более старыми версиями SQL Server, чтобы давать непоследовательные результаты в зависимости от того, подключаетесь ли вы через OLEDB или ODBC.

+1

Заказ не гарантируется без предложения ORDER BY. Помимо прочего, небольшие изменения в запросе могут изменить порядок. –

+0

Согласен, но вопрос связан с использованием предложения order by, где значения все одинаковы. –

0

Если «имя» было первичным ключом, то индекс имел бы определенный порядок (либо ASC, либо DESC). И это тот порядок, который, я думаю, вы увидите в этом случае. По крайней мере, это поведение, которое я наблюдал в SQL 2008.

Если «имя» не имело индекса, я не считаю, что заказ будет предсказуем вообще.

EDIT:

Таким образом, даже в ситуации, я описал это выглядит как порядок не обязательно будет надежным. Здесь есть лучшее объяснение: SQL best practice to deal with default sort order

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

+1

Заказ не гарантируется без предложения ORDER BY. Помимо прочего, небольшие изменения в запросе могут изменить порядок. –

1

Вообще говоря, вы не можете зависеть от порядка записей, выходящих из таблицы, если вы не укажете предложение order by, а любые записи со значениями sames для полей в предложении order by не будут отсортирован.

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

0

«Естественный» порядок строк - это порядок, в котором индекс CLUSTERED говорит, что они находятся, и это порядок, в который обычно возвращаются строки, если вы не укажете порядок. Тем не менее, корпоративные версии карусельного сканирования означают, что вы не всегда будете получать их в таком порядке, и, как говорили несколько человек, вы никогда не должны полагаться на это.

Если вы укажете заказ и ключ, который вы заказываете, равен для группы строк, тогда заказ не гарантируется вообще.

Смежные вопросы