在MySQL中,where 1000<=字段<=2000的語句會(huì)查詢出什么結(jié)果?
Mysql是大家經(jīng)常使用的一種關(guān)系型數(shù)據(jù)庫,很多開發(fā)人員對(duì)于Mysql的使用也是非常熟悉。但是Mysql中依然有著很多很有意思的小細(xì)節(jié),可能很多經(jīng)常使用它的程序員也并不太了解。那么今天我們就來看一個(gè)例子。
在一張工資表中,如果寫下這樣一個(gè)語句:
會(huì)查詢出什么結(jié)果呢?
可能有些人會(huì)覺得,這樣會(huì)查出所有ebonus在1000和2000之間的數(shù)據(jù)。
也有一部分人會(huì)覺得,這樣的寫法是錯(cuò)誤的,編譯不通過。
那么我們就來試驗(yàn)一下,這樣寫到底會(huì)出現(xiàn)什么結(jié)果。
首先我們準(zhǔn)備一張叫salary的表,結(jié)構(gòu)很簡單,只有員工名字和工資兩個(gè)字段,然后我們輸入幾條測(cè)試數(shù)據(jù),結(jié)果如下:
我們可以看到,一共6條數(shù)據(jù),工資分布在500到3500之間。那我們先來試一下
我們可以看到,我們查出了工資范圍在1000到2000之間的員工,這也是我們想到達(dá)到的效果。
那么我們下面再試一下:
結(jié)果如下
我們可以看到,這樣的寫法沒有報(bào)錯(cuò),但也沒有達(dá)到我們預(yù)期的效果,而是把該表里所有的數(shù)據(jù)都查詢出來了。這是為什么呢?
這里面就涉及到Mysql對(duì)于同樣優(yōu)先級(jí)運(yùn)算符算式的處理了,根據(jù)Mysql的文檔,里面對(duì)于同優(yōu)先級(jí)運(yùn)算符的處理是這樣寫的:
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.
翻譯過來就是,對(duì)于在一個(gè)算式中同樣優(yōu)先級(jí)的運(yùn)算符,從左到右進(jìn)行計(jì)算,例外得是賦值語句,從右到左進(jìn)行計(jì)算。
所以對(duì)于上面的語句,Mysql的理解是這樣的:
先判斷1000<=salary這個(gè)表達(dá)式的值,然后再用這個(gè)表達(dá)式的值與2000進(jìn)行比較,將比較的結(jié)果作為條件。那么1000<=salary的值是多少呢?我們這樣寫一條語句來看一下:
結(jié)果如下:
我們可以看到,這個(gè)值都是0或1,因?yàn)?000<=salary的值是一個(gè)bool值,要么是0,要么是1。對(duì)于工資小于1000的,這個(gè)值就是0,而對(duì)于工資大于等于1000的,這個(gè)值就是1。而我們用0或1與2000比較,那么自然都是小于的了。所以結(jié)果就是條件永遠(yuǎn)成立。因此
會(huì)查詢出表里面所有的值。