![MariaDB必知必会](https://wfqqreader-1252317822.image.myqcloud.com/cover/943/34339943/b_34339943.jpg)
上QQ阅读APP看书,第一时间看更新
7.1.3 理解优先级顺序
WHERE子句可以包含任何数量的AND和OR操作符。结合使用两者可以让你执行高级和复杂的过滤。
然而结合使用AND和OR操作符会产生一个有趣的问题。为了进一步说明,请看一个例子。你需要由供应商1002或1003生产的,且价格高于或等于10的产品。下面的SELECT语句结合使用AND和OR操作符创建了一个WHERE子句:
▼ 输入
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/38a-i.jpg?sign=1739503361-bTCC4jyYd4gxin235Ssq06o8L6ZXsu2v-0-b2622d0388a298cc06750ba7e0b82537)
▼ 输出
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/38b-i.jpg?sign=1739503361-WQCDkp4Ibpcxkj8maw4Hq6m1YxB5nqBo-0-21fc71cc372fbf2ab7ea86a53c3ce038)
▼ 分析
请看列出的结果,返回的数据中有两行价格低于10。因此,显然没有按预期进行过滤。什么原因呢?答案是计算次序。SQL像许多语言一样在OR之前执行AND操作符。当SQL遇到前面的WHERE子句,它读取供应商1002生产的产品,而不管其价格是多少,以及任何由供应商1003生产的价格高于或等于10的产品。换句话说AND的优先级更高,操作符被错误地结合。
问题的解决方案是显式使用括号对相关的操作符分组。看下面这个SELECT语句及其输出:
▼ 输入
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/39-i.jpg?sign=1739503361-qgHSZ9z65zL04AEi68b7ZHz4KTa0ha1t-0-ed4555de392a95a93e24cc54683dee7d)
▼ 输出
![](https://epubservercos.yuewen.com/AE5E39/18365861508119506/epubprivate/OEBPS/Images/39a-i.jpg?sign=1739503361-Kej31Ors5J6lS3CN3FP6wDXPQJzNcQgK-0-92a9328a1639fa28b2ae04dc3b833fd2)
▼ 分析
这个SELECT语句和先前的语句仅有的不同是,前两个WHERE子句的条件被括号括起来了。由于括号比AND和OR有更高的优先级,DBMS首先过滤括号中的OR条件。SQL语句变成了由供应商1002或1003生产的且价格高于或等于10的产品,这正是你想要的。
提示
在WHERE子句中使用括号 无论何时,当你写的WHERE子句同时包含AND和OR时,显式使用括号对操作符分组。不要依赖默认的优先级序列,即使这就是你想要的优先级。使用括号没有坏处,而且这样做总是可以避免任何歧义。