先来说下场景,本来我的需求是选择出员工角色为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子句,都应该使用圆括号进行分组,这样能消除歧义。