为何错误SQL语句SELECT * FROM COMPANY WHERE AGE=25 OR 27返回全表数据?
为什么错误的SQL条件会返回全表数据?
这是个很典型的SQL逻辑表达式误区,我来给你拆解清楚为什么这条错误语句会返回全表数据:
首先,你写的条件 AGE = 25 OR 27 在SQL里的执行逻辑和你预期的完全不同。SQL要求OR运算符的两边都必须是布尔表达式(也就是能返回真/假结果的判断语句),但你这里OR右边的27只是一个单纯的数值,并不是一个完整的布尔判断。
那SQLite会怎么处理这个数值呢?在SQLite(以及大多数关系型数据库)的规则里,非零的数值会被自动转换为布尔值TRUE,零则会被转换为FALSE。所以你的条件实际上被数据库解析成了:
SELECT * FROM COMPANY WHERE (AGE = 25) OR TRUE;
接下来分析这个逻辑表达式的结果:不管AGE = 25这个条件是真还是假,只要OR的其中一边是TRUE,整个表达式的最终结果就一定是TRUE。也就是说,表中的每一行都满足这个条件,自然就返回了全表的数据。
正确的写法
要实现“检索AGE为25或27的所有数据”的需求,你需要让OR的两边都是完整的布尔判断,比如:
SELECT * FROM COMPANY WHERE AGE = 25 OR AGE = 27;
或者用更简洁高效的IN子句:
SELECT * FROM COMPANY WHERE AGE IN (25, 27);
这样就能精准筛选出符合要求的行啦。
内容的提问来源于stack exchange,提问作者Sean




