非典型 My-SQL 查询的执行顺序

Execution order of an non-typical My-SQL Query

假设我们有 table 具有以下架构:

create table Test(id integer, title varchar(100));
insert into Test(id, title) values(1, "Hello");
insert into Test(id, title) values(20, "Hi");

这种情况下的非典型查询是:

select * from Test where id= 20 < 2 AND SLEEP(1000000000) ;
-- sleep is being executed
select * from Test where id= 20 > 2 AND SLEEP(1000000000) ;
-- sleep is not being executed and nothing is going to be display
select * from Test where id = 20  > 0;
-- shows only one record , where id=20 /// "Hi"
select * from Test where id = 20  > -1;
-- shows whole table structure

在此示例之前,我的问题是在特定的比较时刻发生了什么。为什么如果 id=20 > 0 与 id = 20 > -1.

表现不同

这里是有问题的查询:

SELECT *
FROM Test
WHERE id = 20 > -1;

上面的 return 是整个 table 的原因是 WHERE 子句实际上包含范围比较,并且被评估为:

SELECT *
FROM Test
WHERE (id = 20) > -1;

表达式 (id = 20) 将计算为 1,如果为真,或 0,如果为假。在任何一种情况下,零和一都将始终大于 -1,因此此查询将始终 return 所有记录。