我有一個只有3列的表。當我鍵入下面的查詢爲什麼這個MySQL查詢是正確的?
select * from MyTable order by 5 and 2;
我得到的每一件事情的表(結果是相等的select * from MyTable;
)。我最初的預期是我會遇到某種錯誤。但我沒有明白,爲什麼?
我有一個只有3列的表。當我鍵入下面的查詢爲什麼這個MySQL查詢是正確的?
select * from MyTable order by 5 and 2;
我得到的每一件事情的表(結果是相等的select * from MyTable;
)。我最初的預期是我會遇到某種錯誤。但我沒有明白,爲什麼?
這裏發生的事情是5 and 2
被看作是一個表達式,它被評估爲1.但是,它不應該給出按第一列排序的結果。
其實,我認爲你只是得到排序數據,因爲你已經按照排序順序插入了它。看看這個SQLFiddle:
http://sqlfiddle.com/#!2/3e04e/1
的數據不會被any of the columns
排序,它是由一個value 1
排序。
我不認爲這是這種情況,嘗試用'select * from my_tab命令你自己的小提琴由500;'它會給你一個錯誤 –
@MatteoTassinari你錯了..當你只說500時,它被視爲應該進行排序的列的位置。當你說5和2時,**排序是通過表達式**返回的任何值完成的。例如:當有'TIME'列時,可以按'ORDER BY hour(time_col)'進行排序。 –
+1你是對的 –
select * from MyTable order by 5,2;
It means start with index 5 and bring 2record i.e 5,6,7
但MyTable只有3列,這意味着第5,6,7列不存在。爲什麼我沒有收到錯誤信息? – Brian
當您使用數字值(列號)時,如果提及列號沒有通過任何錯誤。不存在。只有當給定的列名不存在時纔會發生錯誤。 –
當有任何提及列號時,按數字值(列號)排序不會返回任何錯誤。不存在。只有當給定的列名不存在時纔會發生錯誤。所以,從MyTable順序中選擇* 5,2;與工作正常,但選擇*從MyTable順序non_existing_column_name;會通過一個錯誤。 –
order by 5 and 2
被解釋爲order by (5 and 2)
這是一個常量表達式,因此,沒有真正的排序完成並且數據被簡單地在它插入的順序示出。
然後,他應該使用逗號代替5,然後按2排序 –
我想我明白了。 (5 and 2)==(true AND true)==(1 AND 1)== 1.謝謝你的回答:) – Brian
@lyen事實並非如此,數據按值1排序,而不是第一列的值 - 檢查我的答案和我提供的SQLFiddle示例。 –
由於列順序可能會更改,所以不建議使用它 –
答案似乎是「我們不知道!」但是,看起來好像在使用AND的情況下,ORDER BY子句僅僅被忽略。 – Strawberry
@Strawberry我認爲我可以,但我可能是錯的。 –