You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何错误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

火山引擎 最新活动