先来说下场景,本来我的需求是选择出员工角色为1或3所创建的业务域且业务域id大于100的数据:
SQL语句中OR和AND混合使用的求值顺序问题
结果:
SQL语句中OR和AND混合使用的求值顺序问题
然而,返回的结果中有2行domain_id是小于100的。显然domain_id > 100的这个条件未按预期进行。

原因

在sql语句中的求值顺序,优先处理AND操作符,再处理OR操作符号。所以它先是执行了bds.staff_role = 3
AND domain_id > 100 这里,再执行bds.staff_role = 1 。
SQL语句中OR和AND混合使用的求值顺序问题SQL语句中OR和AND混合使用的求值顺序问题
DBMS看到这段语句时,它的理解是员工角色为3创建的业务域且业务域id大于100的数据,以及员工角色为1创建所有业务域,而不管员工角色为1创建业务域的id是否大于100。

解决方案

使用圆括号进行明确分组,圆括号具有比AND或OR操作符更高的求值顺序。
输入:
SQL语句中OR和AND混合使用的求值顺序问题
输出
SQL语句中OR和AND混合使用的求值顺序问题
这时候DBMS首先过滤括号里面内的OR条件语句,sql语句就变成了选择员工角色为1或3所创建的业务域且业务域id大于100的数据。

另外

可以使用IN操作符,功能与OR相当,且当OR后面的数据量越多时,执行效率会降低。IN操作符比一组OR操作符效率更高。
SQL语句中OR和AND混合使用的求值顺序问题

总结

SQL语句中求值顺序:圆括号>AND操作符>OR操作符。
任何时候使用有AND和OR操作符的WHERE子句,都应该使用圆括号进行分组,这样能消除歧义。

相关文章: