2013-11-04 74 views
6

我有一個只有3列的表。當我鍵入下面的查詢爲什麼這個MySQL查詢是正確的?

select * from MyTable order by 5 and 2; 

我得到的每一件事情的表(結果是相等的select * from MyTable;)。我最初的預期是我會遇到某種錯誤。但我沒有明白,爲什麼?

+0

由於列順序可能會更改,所以不建議使用它 –

+0

答案似乎是「我們不知道!」但是,看起來好像在使用AND的情況下,ORDER BY子句僅僅被忽略。 – Strawberry

+0

@Strawberry我認爲我可以,但我可能是錯的。 –

回答

2

這裏發生的事情是5 and 2被看作是一個表達式,它被評估爲1.但是,它不應該給出按第一列排序的結果。

其實,我認爲你只是得到排序數據,因爲你已經按照排序順序插入了它。看看這個SQLFiddle:

http://sqlfiddle.com/#!2/3e04e/1

的數據不會被any of the columns排序,它是由一個value 1排序。

+0

我不認爲這是這種情況,嘗試用'select * from my_tab命令你自己的小提琴由500;'它會給你一個錯誤 –

+0

@MatteoTassinari你錯了..當你只說500時,它被視爲應該進行排序的列的位置。當你說5和2時,**排序是通過表達式**返回的任何值完成的。例如:當有'TIME'列時,可以按'ORDER BY hour(time_col)'進行排序。 –

+0

+1你是對的 –

1

5和2是列索引,它們表示第5列和第2列。

+0

但返回的數據按第1列排序。如何解釋這種現象? – Brian

0
select * from MyTable order by 5,2; 
It means start with index 5 and bring 2record i.e 5,6,7 
+0

但MyTable只有3列,這意味着第5,6,7列不存在。爲什麼我沒有收到錯誤信息? – Brian

+0

當您使用數字值(列號)時,如果提及列號沒有通過任何錯誤。不存在。只有當給定的列名不存在時纔會發生錯誤。 –

+0

當有任何提及列號時,按數字值(列號)排序不會返回任何錯誤。不存在。只有當給定的列名不存在時纔會發生錯誤。所以,從MyTable順序中選擇* 5,2;與工作正常,但選擇*從MyTable順序non_existing_column_name;會通過一個錯誤。 –

6

order by 5 and 2被解釋爲order by (5 and 2)這是一個常量表達式,因此,沒有真正的排序完成並且數據被簡單地在它插入的順序示出。

+0

然後,他應該使用逗號代替5,然後按2排序 –

+1

我想我明白了。 (5 and 2)==(true AND true)==(1 AND 1)== 1.謝謝你的回答:) – Brian

+0

@lyen事實並非如此,數據按值1排序,而不是第一列的值 - 檢查我的答案和我提供的SQLFiddle示例。 –