Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL语句中使用或不使用括号到底有什么区别?_Sql_Mysql - Fatal编程技术网

在MySQL语句中使用或不使用括号到底有什么区别?

在MySQL语句中使用或不使用括号到底有什么区别?,sql,mysql,Sql,Mysql,我有一个疑问: SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' AND `status` = 'active' OR `status` = 'past due' 它不会返回正确的结果。但是,在OR条件周围添加括号使其工作如下: SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' AND (`status

我有一个疑问:

SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02' 
    AND `status` = 'active' OR `status` = 'past due'
它不会返回正确的结果。但是,在OR条件周围添加括号使其工作如下:

SELECT * FROM (`users`) WHERE `date_next_payment` <= '2011-02-02'
    AND (`status` = 'active' OR `status` = 'past due')
我的问题是为什么不同?我理解,在没有括号的情况下,s以不同的方式考虑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脚本。 status='active'为条件false,则不评估下一状态列CONDICTIONSTATUS

在第二个问题中

括号具有高优先级

。因此,状态=‘活动’或状态=‘过期’条件首先评估。

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

首先或将要完成,然后和将要完成。。。这将给出不同的答案

MySQL手册上有一页。它表明,和具有更高的优先级。因此p1和p2或p3被解释为p1和p2或p3。真值表很容易让您相信这与p1和p2或p3不同

最后,TRUE和TRUE==TRUE

SELECT * FROM (`users`) WHERE TRUE
所以记录被返回


想象一下对数据库中的每一行按这样的步骤执行查询有时有助于理解将括号放在何处。

这是因为当您不使用括号时,实际上是在说:

`date_next_payment` <= '2011-02-02'     AND `status` = 'active'
OR
`status` = 'past due'.
这意味着当状态“=”过期“时,此记录也将显示。无法通过其他条件

但如果使用括号,则需要:

 `date_next_payment` <= '2011-02-02'

并传递另外两个条件中的一个。

SQL并没有什么特别之处,它是关于布尔逻辑的。 你的第一句话是:

a和b或c

这意味着,如果任何一个c为真,则得到该行

在a和b或c中


只有a为真且b或c为真的行。

添加括号时,您正在更改条件

在初始情况下,结果集由满足条件的记录组成

`date_next_payment` <= '2011-02-02' AND `status` = 'active' 
`status` = 'active' 
添加括号后,结果集将由满足条件的记录组成

 `status` = 'past due'.
`date_next_payment` <= '2011-02-02' 

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