我正在使用MySQL 8.0.
我创建了以下表格
SET SESSION sql_mode='ERROR_FOR_DIVISION_BY_ZERO';
create table Test(
col1 integer,
col2 integer
);
create table Test1(
colA integer,
colB varchar(45)
);
我用这些值填充它们:
Test Test1
1 2 2 a
3 4 4 b
1 5
1 2
0 4
0 2
现在,从其他答案中,我知道,一般来说,我不能依赖短路,因为SQL是一种declarative语言,所以您可以指定what而不是how:这留给rdbms优化器,它可以自由地重新安排条件的顺序.
我对Test
表执行了以下查询:
SELECT *
FROM Test
WHERE col2/col1>0 AND col1<>0;
SHOW WARNINGS;
我有两个关于两个零除法的警告(如预期),这与上述查询的执行计划中报告的执行顺序相匹配:
"attached_condition": "(((`prova`.`test`.`col2` / `prova`.`test`.`col1`) > 0) and
(`prova`.`test`.`col1` <> 0))"
这清楚地表明,在col1<>0
之前判断col2/col1>0
然后,我对上述表运行了以下查询:
SELECT *
FROM Test T JOIN Test1 T1 ON T.col2=T1.colA
WHERE T.col2/T.col1>0 AND T.col1<>0;
同样,这次我本以为会出现除数为零的警告
"attached_condition": "((`prova`.`t`.`col2` = `prova`.`t1`.`colA`) and
((`prova`.`t1`.`colA` / `prova`.`t`.`col1`) > 0) and (`prova`.`t`.`col1` <> 0))"
这怎么可能?