最近写 sql,or 跟 and 一起使用是会有坑的,特此记录一下
首先来看看事例数据
图中共有14条数据
大概可以看出,lx=‘1’ 的有10条数据,lx=‘2’ 的有4条数据
查找 lx=‘1’,zt=‘4’ 的数据
查出有 9 条数据是 zt=‘4’,换句话说有 1 条数据是 zt=‘0’ 的,可以通过第一张图确认一下。
好了,坑开始来了。
正常逻辑下,我们一般是要查找 lx=‘1’ 并且 zt=‘4’ 或者 zt=‘0’ 的,可能有时候一不注意,就出问题了。
-- 查找 lx='1' 并且 zt='4' 或者 zt='0' ??
SELECT lx,zt FROM log_yjxx WHERE lx = '1' AND zt = '4' OR zt = '0'
咋一看,这条 sql 好像没有错,但是看看结果
把 zt=‘0’ 都查出来了,所以 9 条 zt=‘4’ 加上 5条 zt=‘0’ 的就 14 条数据。
数据例子可能不好,应该修改一两个 zt 等于其它的。
-- 但实际上,这条 sql 的意思是:
-- 查找 lx='1' 且 zt='4' 的集合,又或者是 zt='0'的数据
SELECT lx,zt FROM log_yjxx WHERE lx = '1' AND zt = '4' OR zt = '0'
而我们实际要查找的集合是,在 lx=‘1’ 的前提下,zt=‘0’ 或者 zt=‘4’ 的数据,所以 zt 这里要加个小括号,就没有问题了。