我有这个查询:
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语句;但我不知道它有什么不同。
我尚未找到任何对此有所帮助的文档。如果有任何链接,我将非常感谢。
这是因为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脚本)中,这些运算符的优先顺序是相同的。