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