当前位置: 首页 > 科技观察

MySQL中,where1000-=field-=2000语句会查询到什么结果?

时间:2023-03-14 00:30:26 科技观察

Mysql是大家经常使用的关系型数据库,很多开发者对Mysql的使用也非常熟悉。但是Mysql中还是有很多有趣的小细节,很多经常使用的程序员对它的了解可能并不多。那么今天我们就来看一个例子。在薪水表中,如果写这样一条语句:select*fromsalarywhere1000<=salary<=2000;查询的结果是什么?可能有人认为这样会把ebonus的1000到2000之间的所有数据都找出来,也有一些人认为这种写法不对,编译失败。那我们来实验一下,看看这样写会怎么样。首先我们准备一个表salary,结构很简单,只有员工姓名和salary两个字段,然后我们输入几条测试数据,结果如下:可以看到一共有6个数据,薪资分布在500到3500之间。然后让我们尝试select*fromsalarywhere1000<=salaryandsalary<=2000;可以看到我们已经找到了工资范围在1000到2000之间的员工,这也是我们想要达到的效果。那我们再试一次:select*fromsalarywhere1000<=salary<=2000;结果如下,我们可以看到这种写法并没有报错,但是没有达到预期的效果,而是把所有的数据都查询出来了。为什么是这样?这就涉及到Mysql对同优先级算子的处理。根据Mysql文档,具有相同优先级的运算符的处理如下:对于表达式中出现在相同优先级级别的运算符,评估从左到右进行,除了赋值从右到左评估。翻译过来就是,对于同一个优先级的运算符,在一个计算中,是从左到右计算的,例外的一定是赋值语句,从右到左计算。所以对于上面的语句,Mysql的理解是这样的:select*fromsalarywhere(1000<=salary)<=2000;先判断表达式的值1000<=salary,然后用这个表达式的值和2000进行比较,并将比较的结果作为条件。那么1000<=salary的价值是多少呢?让我们写这样一个语句:select*,(1000<=salary)fromsalary;结果如下:我们可以看到这个值是0或者1,因为1000<=salary的值是一个bool值,或者Either0或者1。工资小于1000,这个值就是0,而对于工资大于等于1000,这个值就是1。而0或者1跟2000比较,自然都是小于。所以结果是条件总是为真。所以select*fromsalarywhere1000<=salary<=2000;会查询表中所有的值。