一尘不染

在带/不带括号的MySQL语句中使用OR到底有何不同?

mysql

我有这个查询:

SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' 
    AND `status` = 'active' OR `status` = 'past due'

哪个不会返回正确的结果。但是,在“或”条件周围加上括号可使其工作如下:

SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND (`status` = 'active' OR `status` = 'past due')

我的问题是为什么与众不同?我知道这是在考虑不带括号的OR语句;但我不知道它有什么不同。

我尚未找到任何对此有所帮助的文档。如果有任何链接,我将非常感谢。


阅读 785

收藏
2020-05-17

共1个答案

一尘不染

这是因为OR的 运算符优先级 低于AND。每当DB看到类似

A AND B OR C

首先评估AND,即等于

(A AND B) OR C

因此,如果您明确想要

A AND (B OR C)

相反,您必须在括号中加上括号。

顺便说一句,这并非特定于SQL。在我所知道的所有编程语言(即至少C,C ++,C#,Java和Unix Shell脚本)中,这些运算符的优先顺序是相同的。

2020-05-17