在MySQL中,where 1000<=字段<=2000的語句會查詢出什么結果?
Mysql是大家經常使用的一種關系型數據庫,很多開發人員對于Mysql的使用也是非常熟悉。但是Mysql中依然有著很多很有意思的小細節,可能很多經常使用它的程序員也并不太了解。那么今天我們就來看一個例子。
在一張工資表中,如果寫下這樣一個語句:
會查詢出什么結果呢?
可能有些人會覺得,這樣會查出所有ebonus在1000和2000之間的數據。
也有一部分人會覺得,這樣的寫法是錯誤的,編譯不通過。
那么我們就來試驗一下,這樣寫到底會出現什么結果。
首先我們準備一張叫salary的表,結構很簡單,只有員工名字和工資兩個字段,然后我們輸入幾條測試數據,結果如下:
我們可以看到,一共6條數據,工資分布在500到3500之間。那我們先來試一下
我們可以看到,我們查出了工資范圍在1000到2000之間的員工,這也是我們想到達到的效果。
那么我們下面再試一下:
結果如下
我們可以看到,這樣的寫法沒有報錯,但也沒有達到我們預期的效果,而是把該表里所有的數據都查詢出來了。這是為什么呢?
這里面就涉及到Mysql對于同樣優先級運算符算式的處理了,根據Mysql的文檔,里面對于同優先級運算符的處理是這樣寫的:
For operators that occur at the same precedence level within an expression, evaluation proceeds left to right, with the exception that assignments evaluate right to left.
翻譯過來就是,對于在一個算式中同樣優先級的運算符,從左到右進行計算,例外得是賦值語句,從右到左進行計算。
所以對于上面的語句,Mysql的理解是這樣的:
先判斷1000<=salary這個表達式的值,然后再用這個表達式的值與2000進行比較,將比較的結果作為條件。那么1000<=salary的值是多少呢?我們這樣寫一條語句來看一下:
結果如下:
我們可以看到,這個值都是0或1,因為1000<=salary的值是一個bool值,要么是0,要么是1。對于工資小于1000的,這個值就是0,而對于工資大于等于1000的,這個值就是1。而我們用0或1與2000比較,那么自然都是小于的了。所以結果就是條件永遠成立。因此
會查詢出表里面所有的值。