MySql的Where条件中连续用小于或大于比较能否执行?能执行的话会得到什么结果?

首先解释一下标题,如SELECT * FROM user WHERE 1<age<4,这句话能否执行?能执行的话会得到什么结果?

且看这样一张表

idnameage
1张三6
2李四7
3王五8
4赵六9

当你想要筛选出1-4岁之间(不包含)的年龄的人,可能会写出如下Sql语句:

SELECT * FROM user WHERE age>1 AND age<4

也有可能一时糊涂写出以下Sql语句:

SELECT * FROM user WHERE 1<age<4

会得到以下结果

idnameage
1张三6
2李四7
3王五8
4赵六9

返回的结果明显不是我们想要的,居然将整张表查了出来。

有基础的人都知道,如果需要比较两次,中间需要使用AND连接,直接比较两次是错误的语法。

其实在MySql中这样的语法并不错误,之所以得到这样结果,是因为这是理所当然的(不然还能得到什么结果?)。

首先将1<age<4拆分成两部分,一部分是"1<age",另一部分是"(1<age)的结果再<4"。

由于这张表里面所有的age都比1大,所以1<age的结果肯定都为true,true就是1(false也就是0)。

之后再使用这个1,去运算"(1<age)的结果再<4",也就是"1<4",这个结果明显也是1(true)。

既然where的条件的结果都是true,那Sql语句的执行结果自然就是所有的行了。

试着将Sql语句改成

SELECT * FROM USER WHERE 1<age!=1

这样返回的行数就是0了,因为"1<age"的结果为1(true),"1!=1"的结果为0(false)。

再改成:

SELECT * FROM USER WHERE 6<age=1

返回结果为:

idnameage
2李四7
3王五8
4赵六9

age为6的不见了,因为按照where条件,6<6结果为0(false),0=1的结果为0(false),所以这一行理所应当是不符合条件的,而其它行由于都大于6,所以都符合条件。

最后说一下,这样的写法虽然可行,但是新手容易混淆,实在要使用可以加括号来分割,增加易读性。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值