2010-02-02 47 views
3

假設我有一個表:從數據庫中選擇數據時的順序是什麼?

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

有在表10行,所有行有ORDER_BY相同的值(比方說,這是0)

如果我再發出下面的SQL:

select * from [tab] order by [order_by] 

什麼是行的順序?在這種情況下,決定行順序的因素是什麼?

+1

只是猜測:插入順序? – jinsungy 2010-02-02 20:00:33

+1

@ jinsungy:它可能是,但也可能不是。它取決於數據庫,存在哪些索引,表格的大小等等。 – 2010-02-02 20:03:08

+2

只是提示:不要依賴未定義的行爲。 – mpen 2010-02-02 20:04:20

回答

4

有在這種情況下沒有訂單,因爲你沒有指定順序。

6

如果您訂購的列沒有變化,但沒有保證訂單。

你想有一個定義的順序任何時候,你需要BY子句的良好秩序。我甚至無法想象,爲什麼有人會使用orderby子句,如果列中沒有變化,或者爲什麼你甚至會擁有一個永遠只有一個值的列。

8

沒有定義。數據庫可以按照它選擇的任何順序吐出它們,它甚至可以改變查詢之間的順序,如果它感覺像它(它可能不會這樣做,但不應該依賴順序是一致的)。

+4

對錢。訂單未定義:-)。不要假設任何特定的順序。 – 2010-02-02 20:03:50

1

我在現實生活中的經驗是,當你不指定任何順序(或指定一個實際上並不導致排序,在這種情況下)行通常問世它們添加到表中的順序。但是,這絕不是保證,我絕不會依賴它。

+4

這絕對不會總是發生,你不應該依賴它。 – HLGEM 2010-02-02 20:03:04

0

通常你的表有一個PKey標識列。如果是這種情況,那麼這將是SQL Server 2008中的順序。不幸的是,我經歷了舊版本的SQL Server,趨向於給出不一致的結果,具體取決於您是通過OLEDB還是ODBC進行連接。

+1

如果沒有ORDER BY子句,則不保證訂單。除此之外,查詢中的小改動可以改變順序。 – 2010-02-02 20:06:48

+0

我同意,但這個問題涉及使用一個order by子句,其中的值都是相同的。 – 2010-02-03 17:43:49

0

如果「名稱」是一個主鍵,則該指數將具有規定的順序(或者ASC或DESC)。這是我認爲你會在這種情況下看到的順序。至少這是我在SQL 2008中觀察到的行爲。

如果'name'沒有索引,那麼我不相信訂單是可以預測的。

編輯:

所以即使在我描述它看起來像的順序並不一定是可靠的情況。這裏有一個更好的解釋:SQL best practice to deal with default sort order

我想故事的寓意是指定一個命令,如果命令對你很重要。

+1

如果沒有ORDER BY子句,訂單不能保證。除此之外,查詢中的小改動可以改變順序。 – 2010-02-02 20:09:27

1

一般來說,除非您指定一個order by子句,否則任何記錄的order by子句中的字段都不會是排序。

話雖這麼說,有辦法讓一個受過教育的猜測,那會出來記錄的順序。通常,它們將按照表格聚簇索引的順序排出。這通常是主鍵,但並非總是如此。如果沒有聚集索引,那麼它通常是插入順序。請注意,你不能依賴這些事情。 SQL Server可能會進行一些優化來改變順序。

0

行的'自然'順序是CLUSTERED索引所表示的順序,如果沒有指定順序,通常會返回行的順序。然而,企業版的旋轉掃描意味着你不會總是按照這個順序來獲取它們,正如少數人所說的那樣,你永遠不應該依賴它。

如果您指定了訂單,並且您訂購的關鍵字與一堆行相同,那麼訂單根本不能保證。