Mysql中,1=1和 1=1=1 和 -1=-1 和 -1=-1=-1 和 5=5 和 5=5=5 有什麼區別


      首先,思考下面幾個問題:

select 1=1;  --返回什麼?
select 1=1=1;  --返回什麼?
select -1=-1;  --返回什麼?
select 1=1;  --返回什麼?
select 5=5;  --返回什麼?
select 5=5=5;  --返回什麼?
select 5=5=1;  --返回什麼?
select 5=1=0;  --返回什麼?

      今天做一道題,很有意思。相關鏈接在這:我是鏈接 https://blog.csdn.net/weixin_42845682/article/details/105264355

一、 幾種情況

1. 初始情況 1=1=1

      首先,有如下一張表:

+------+------+------+------+------+------+
| i1   | n1   | i2   | n2   | i3   | n3   |
+------+------+------+------+------+------+
|    1 |    1 |    2 |    1 |    3 |    1 |
+------+------+------+------+------+------+

      我想查出n1=n2=n3的n1的值。
      對這張表執行如下sql:

select 
	n1
from logs
where n1 = n2 = n3 

      查詢結果如下:

+------+
| n1   |
+------+
|    1 |
+------+

2. 其他情況 5=5=5

      上面的n1、n2、n3值都爲1,假設換成5呢?
      

+------+------+------+------+------+------+
| i1   | n1   | i2   | n2   | i3   | n3   |
+------+------+------+------+------+------+
|    1 |    5 |    2 |    5 |    3 |    5 |
+------+------+------+------+------+------+

      我想查出n1=n2=n3的n1的值。
      對這張表執行如下sql:

select 
	n1
from logs
where n1 = n2 = n3 

      查詢結果如下:

Empty set (0.00 sec)

      

3. 其他情況 -1=-1=-1

      假設表是下面這樣

+------+------+------+------+------+------+
| i1   | n1   | i2   | n2   | i3   | n3   |
+------+------+------+------+------+------+
|    1 |   -1 |    2 |   -1 |    3 |   -1 |
+------+------+------+------+------+------+

      我想查出n1=n2=n3的n1的值。
      對這張表執行如下sql:

select 
	n1
from logs
where n1 = n2 = n3 

      查詢結果如下:

Empty set (0.00 sec)

      

二、 分析一下

1. 正確的sql

      首先,如果使用下面的sql,無論n1、n2、n3的值是什麼,都能準確的查出來。

select 
	n1
from logs
where n1 = n2
and n2 = n3 

      但是我想不通,爲什麼 n1 = n2 =n3就不對呢?

2. 初步分析

      首先聲明:logs表已經處理了,現在裏面只有一條數據。
      下面分別是執行的sql和返回的結果:

mysql> select 1 from logs where 1=1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select 1 from logs where 1=1=1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

       從上面兩條可以看到:1=1或者1=1=1都沒問題。

mysql> select 1 from logs where 5=5;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select 1 from logs where 5=5=5;
Empty set (0.00 sec)
mysql> select 1 from logs where -1=-1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
mysql> select 1 from logs where -1=-1=-1;
Empty set (0.00 sec)

       從上面可以看出來,5=5,-1=-1能查出來;但是5=5=5,-1=-1=-1就查不出來。

3. 繼續分析

1). 1=1

      下面分別是執行的sql和返回的結果:

mysql> select 1=1;
+-----+
| 1=1 |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=1=1;
+-------+
| 1=1=1 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

       首先,我一直以爲,1=1應該返回true,但是返回了1。從這裏開始,我有個想法:mysql中的判斷條件(類似n1=n2這種),返回的不是true或者false,而是返回的1和0。
       可以看到,sql裏,1=1的結果是1(假設爲i),i=1的結果還是1。

2). 其他情況

mysql> select 5=5;
+-----+
| 5=5 |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)
mysql> select 5=5=5;
+-------+
| 5=5=5 |
+-------+
|     0 |
+-------+
1 row in set (0.00 sec)

       可以看到,sql裏,5=5的結果是1(假設爲i),i=5的結果變成了0。

mysql> select -1=-1;
+-------+
| -1=-1 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)
mysql> select -1=-1=-1;
+----------+
| -1=-1=-1 |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

       可以看到,sql裏,-1=-1的結果是1(假設爲i),i=-1的結果變成了0。
       再驗證一下:

mysql> select 1!=1;
+------+
| 1!=1 |
+------+
|    0 |
+------+
1 row in set (0.00 sec)

       嗯。。。。應該返回false的地方,返回了0。看來我的想法是對的。

三、 結論

1. 結論

       關於這條sql:

select 
	n1
from logs
where n1 = n2 = n3 

       我一直認爲:這個sql中,應該是n1=n2且n2=n3的效果;但實際上,是n1=n2,然後看n1=n2的值是否等於n3。
       經過上面的幾個sql判斷,一個判斷條件,返回的是1或者0,對應true或者false。
       也就是說,n1=n2,結果只會是1或者0。

2. 驗證結論

       執行如下sql:

select 1=2=0;

       如果這是代碼,應該返回false纔對。但是如果看上面的結論,1=2返回0,0=0返回1,所以應該返回1纔對。看一下執行結果:

mysql> select 1=2=0;
+-------+
| 1=2=0 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

       看來我的結論是對的。。。

四、 拓展一下

       根據上面的sql,1=2=0返回的是0。那麼想想,()應該也生效吧?

mysql> select 1=(2=0);
+---------+
| 1=(2=0) |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

       先執行2=0,結果是0;0=1,返回0。
       再驗證一下:

mysql> select 0=(2=0);
+---------+
| 0=(2=0) |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

       先執行2=0,結果是0;0=0,返回1。
       嗯,我的結論是對的,且()可以提高優先級。

五、後傳

       感謝某大佬指點,我想起來了,我在java裏寫代碼,寫的都是a==b&&b==c,沒寫過a==b==c…
      嗯,腦殘了。。。從java來說,a==b返回的肯定是一個boolean,boolean!=具體的數字是一個很正常的行爲…
       不過想一想,mysql返回的是1或者0,而不是true或者false,這也算一個發現吧?。。。嗯嗯,算的。。。

六、後後傳

1. 第一次驗證

       mysql返回的1或者0,和true或false是什麼關係呢?…

mysql> select 1=true;
+--------+
| 1=true |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

mysql> select 1=false;
+---------+
| 1=false |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)

mysql> select 0=false;
+---------+
| 0=false |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

mysql> select 0=true;
+--------+
| 0=true |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)

2. 第二次驗證

       嗯。。。這個不算返回值,是我自己定義的1或者0,試試返回值。

mysql> select 1=1;
+-----+
| 1=1 |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)

mysql> select 1=1=true;
+----------+
| 1=1=true |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> select 1=1=false;
+-----------+
| 1=1=false |
+-----------+
|         0 |
+-----------+
1 row in set (0.00 sec)

       試一試0的值

mysql> select 1=2;
+-----+
| 1=2 |
+-----+
|   0 |
+-----+
1 row in set (0.00 sec)

mysql> select 1=2=true;
+----------+
| 1=2=true |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> select 1=2=false;
+-----------+
| 1=2=false |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

3. 結論

      mysql返回的1或者0,以及自己定義的1或者0,基本等於true或者false…
      感覺我把自己感動了半天…唉…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章