先来说下场景,本来我的需求是选择出员工角色为1或3所创建的业务域且业务域id大于100的数据:

结果:

然而,返回的结果中有2行domain_id是小于100的。显然domain_id > 100的这个条件未按预期进行。
原因
在sql语句中的求值顺序,优先处理AND操作符,再处理OR操作符号。所以它先是执行了bds.staff_role = 3
AND domain_id > 100 这里,再执行bds.staff_role = 1 。


DBMS看到这段语句时,它的理解是员工角色为3创建的业务域且业务域id大于100的数据,以及员工角色为1创建所有业务域,而不管员工角色为1创建业务域的id是否大于100。
解决方案
使用圆括号进行明确分组,圆括号具有比AND或OR操作符更高的求值顺序。
输入:

输出

这时候DBMS首先过滤括号里面内的OR条件语句,sql语句就变成了选择员工角色为1或3所创建的业务域且业务域id大于100的数据。
另外
可以使用IN操作符,功能与OR相当,且当OR后面的数据量越多时,执行效率会降低。IN操作符比一组OR操作符效率更高。

总结
SQL语句中求值顺序:圆括号>AND操作符>OR操作符。
任何时候使用有AND和OR操作符的WHERE子句,都应该使用圆括号进行分组,这样能消除歧义。
本文解析了SQL查询中AND与OR操作符的求值顺序问题,导致查询结果不符合预期的原因,并提供了解决方案。通过使用圆括号进行明确分组,可以避免歧义,确保查询结果准确。同时介绍了IN操作符的高效用法。
4076

被折叠的 条评论
为什么被折叠?



