SQL语句中OR和AND混合使用的求值顺序问题

本文解析了SQL查询中AND与OR操作符的求值顺序问题,导致查询结果不符合预期的原因,并提供了解决方案。通过使用圆括号进行明确分组,可以避免歧义,确保查询结果准确。同时介绍了IN操作符的高效用法。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值