2013-08-04 140 views
2

我創建了一個名爲HOSTEL(hostel_num NUMBER, num_of_stud NUMBER)表和我插入的值爲:當我施加GROUP BY命令作爲GROUP BY在SQL代碼子句

-------------------------- 
hostel_num | num_of_stud | 
-------------------------- 
1001  | 124  | 
1001  | 234  | 
1002  |  97  | 
1002  | 134  | 
1003  | 234  | 
1004  | 123  | 
1004  |  89  | 
1001  |  67  | 
-------------------------- 

SELECT hostel_num, sum(num_of_stud) as total_students 
FROM HOSTELS 
GROUP BY hostel_num; 

,並且我得到的結果爲:

----------------------------- 
hotel_num | total_students | 
----------------------------- 
1003  |  234  | 
1001  |  425  | 
1002  |  231  | 
1004  |  212  | 
----------------------------- 

現在,我的問題是:爲什麼hostel_num 1003出現在頂部?它不應該排在第3行嗎?這種秩序背後的邏輯是什麼?

我知道,GROUP BY子句合併重複的列值並將它們組合在一起。

我的疑問是:它是如何決定顯示的值,在這裏,我期待像這樣的輸出順序:

----------------------------- 
hotel_num | total_students | 
----------------------------- 
1001  |  425  | 
1002  |  231  | 
1003  |  234  | 
1004  |  212  | 
----------------------------- 

回答

3

如果沒有ORDER BY,沒有訂單有保證:

SELECT hostel_num, sum(num_of_stud) as total_students 
FROM HOSTELS 
GROUP BY hostel_num 
ORDER BY hostel_num; 
+0

如果你試圖說它隨機挑選的命令,那麼我會說,我執行命令3-4次,每次它顯示相同的順序。如果它隨機選擇訂單,那麼下一次的輸出必定會有所不同。但是輸出沒有改變。 –

+1

正如我喜歡說的,訂購是一種沒有ORDER BY的錯覺。通常您會看到由主鍵排序的行(因爲它是一個集羣索引),但有時您不會:-)如果您在集羣中有多個服務器並且在它們之間細分查詢,則會經常發生這種情況。 – xanatos

+3

@Rubbal Bhusri:那不是我說的。如果顯式的ORDER BY不存在,查詢執行器可以按任意順序返回結果。期。他們以特定順序出來的事實取決於如何確定查詢執行計劃。 –

0

你想用Order By

SELECT hostel_num , 
     SUM(num_of_stud) AS total_students 
FROM HOSTELS 
GROUP BY hostel_num 
ORDER BY hostel_num 

Order By解釋。

編輯: 有一個very good answer here你所看到的,看看這也。

+0

如果你試圖說它隨機挑選訂單,那麼我會說,我執行了3-4次命令,並且每次都顯示相同的順序。如果它隨機選擇訂單,那麼下一次的輸出必定會有所不同。但是輸出沒有改變。 –

+0

我知道ORDER BY子句,但我想更深入地瞭解GROUP BY子句的行爲。 –

+0

@RubbalBhusri,我看不到我指定** random **的地方,我只是說你需要包含'Order By'來告訴** SQL **要排序的字段。你也可以追加'ASC'或'DESC'到最後來改變它的排列方式。 – christiandev

0

請指定你想要的順序,因爲我認爲如果你不指定任何順序由它自己決定的子句。

SELECT hostel_num , 
    SUM(num_of_stud) AS total_students 
FROM HOSTELS 
GROUP BY hostel_num 
ORDER BY hostel_num 
+0

如果你試圖說它隨機挑選了訂單,那麼我會說,我執行了3-4次命令,並且每次都顯示相同的順序。如果它隨機選擇訂單,那麼下一次的輸出必定會有所不同。但是輸出沒有改變。 –

+0

我說它由sql服務器決定,並沒有說它隨機決定訂單 – DevelopmentIsMyPassion

+0

我不想要任何特定的順序,而是想知道,'GROUP BY'子句選擇順序背後的邏輯是什麼。 –