非典型 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 所有记录。
假设我们有 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 所有记录。