MariaDB必知必会
上QQ阅读APP看书,第一时间看更新

7.1.3 理解优先级顺序

WHERE子句可以包含任何数量的AND和OR操作符。结合使用两者可以让你执行高级和复杂的过滤。

然而结合使用AND和OR操作符会产生一个有趣的问题。为了进一步说明,请看一个例子。你需要由供应商1002或1003生产的,且价格高于或等于10的产品。下面的SELECT语句结合使用AND和OR操作符创建了一个WHERE子句:

▼ 输入

▼ 输出

▼ 分析

请看列出的结果,返回的数据中有两行价格低于10。因此,显然没有按预期进行过滤。什么原因呢?答案是计算次序。SQL像许多语言一样在OR之前执行AND操作符。当SQL遇到前面的WHERE子句,它读取供应商1002生产的产品,而不管其价格是多少,以及任何由供应商1003生产的价格高于或等于10的产品。换句话说AND的优先级更高,操作符被错误地结合。

问题的解决方案是显式使用括号对相关的操作符分组。看下面这个SELECT语句及其输出:

▼ 输入

▼ 输出

▼ 分析

这个SELECT语句和先前的语句仅有的不同是,前两个WHERE子句的条件被括号括起来了。由于括号比AND和OR有更高的优先级,DBMS首先过滤括号中的OR条件。SQL语句变成了由供应商1002或1003生产的且价格高于或等于10的产品,这正是你想要的。

提示

在WHERE子句中使用括号 无论何时,当你写的WHERE子句同时包含AND和OR时,显式使用括号对操作符分组。不要依赖默认的优先级序列,即使这就是你想要的优先级。使用括号没有坏处,而且这样做总是可以避免任何歧义。