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…
      感觉我把自己感动了半天…唉…

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