mysql或/和-操作顺序如何工作

mysql或/和-操作顺序如何工作,mysql,sql,database,Mysql,Sql,Database,我正在查看一个查询,该查询应在一个月内根据其在日期创建的或在日期返回的提取交易列表 SELECT * FROM (`transaction`) WHERE `created_at` >= '2014-08-01' AND `created_at` <= '2014-08-31' OR `returned_at` >= '2014-08-01' AND `returned_at` <= '2014-08-31' 奇怪的是,最初的查询似乎正在运行,尽管我不确定这是

我正在查看一个查询,该查询应在一个月内根据其在日期创建的或在日期返回的提取交易列表

SELECT * 
FROM (`transaction`) 
WHERE `created_at` >= '2014-08-01' 
AND `created_at` <= '2014-08-31' 
OR `returned_at` >= '2014-08-01' 
AND `returned_at` <= '2014-08-31'

奇怪的是,最初的查询似乎正在运行,尽管我不确定这是否是因为我的数据集。有人能澄清一下,两个sql语句总是返回相同的结果吗?

明确地编写它总是一个好主意,但是是的

为方便起见,请为您明确检查所有这些选项:

$ php -r '$d = 0; while($d < pow(2,4)){$bin = sprintf("%04b",$d); echo $bin." => ".@mysql_result(mysql_query("SELECT ".$bin[0]." AND ".$bin[1]." OR ".$bin[2]." AND ".$bin[3]),0,0).PHP_EOL;$d++;}'
0000 => 0
0001 => 0
0010 => 0
0011 => 1
0100 => 0
0101 => 0
0110 => 0
0111 => 1
1000 => 0
1001 => 0
1010 => 0
1011 => 1
1100 => 1
1101 => 1
1110 => 1
1111 => 1
$php-r'$d=0;而($d”@mysql_结果(mysql_查询(“选择“$bin[0]”和“$bin[1]”或“$bin[2]”和“$bin[3]),0,0)。PHP_EOL;$d++}
0000 => 0
0001 => 0
0010 => 0
0011 => 1
0100 => 0
0101 => 0
0110 => 0
0111 => 1
1000 => 0
1001 => 0
1010 => 0
1011 => 1
1100 => 1
1101 => 1
1110 => 1
1111 => 1

是的,算符优先等等。如果下一个人很难一目了然地看到它的功能,我仍然会把这个查询扔回去。

它的运算符进位。并保证在查询之前进行评估或

根据您的数据,这两个查询可能返回相同的数据。OR操作数将与其他AND操作数冲突,因为每个AND操作数的优先级不同

第二个查询是一种方法,但您可以使用between:

SELECT * FROM (`transaction`) 
WHERE (`created_at` BETWEEN '2014-08-01' AND '2014-08-31') 
   OR (`returned_at` BETWEEN '2014-08-01' AND '2014-08-31')

就像数学一样,括号很重要。这两个查询不是同一件事。@Andrew在这种特殊情况下,这两个查询是一样的,但是如果一个人混合了
,使用括号总是一个好主意。我总是使用偏执,如果在我使用的技术中不遵守这一规则,我不会冒险破坏我的代码。所以我把那些妄想放在那里,它不需要太多时间,我可以不做噩梦地睡觉。你能给我看看这里吗?我知道这一点,应该在或之前进行评估,但在哪里可以保证?是否很难键入一些偏执的论点,以便您确信自己编写了正确的代码,而不是相信自己编写了正确的代码?请参阅和。三个数据库管理系统保证了这一点。然而,我并不是建议你使用它。我只是在解释为什么即使没有括号,结果也是这样。正如wrikken所说,使用括号总是一个好主意。为了代码的清晰性/可读性,即使你确信如果没有它们,它的表现会如你所期望的那样。你评论中的链接指向特定版本的文档。也许我做代码编写的时间太长了,但我看到过很多文档与事实不符的情况,以及同一项目的另一个/新版本的行为不一致的情况。相信一个文档是很自然的,不将可能出现的bug数量最小化不是一种负责任的行为。例如,如果MySQL的新版本出现,由于某种原因,此规则不受尊重,并且您在许多项目开发中多次在代码中信任此规则,并且由于此,您的客户损失了太多的钱,并且没有资源继续为您的开发付费,您会怎么做?你不觉得有责任吗?是的,而且应该在OR之前,我建议大家使用偏执狂来获得更多的安全性。文件不是保证。如果是这样的话,我们的生活就会轻松得多。以Facebook API的文档为例。在许多情况下,我已经看到,根据文档,这个东西不起作用。太糟糕了,最终我决定根本不读它,而是做实验。忘掉这三个暗示吧。SQL(独立于实现)定义此优先级。看看如果您担心实现会改变一些基本的操作,比如操作符优先级,那么您也可能担心它们会改变SELECT的含义。
SELECT * FROM (`transaction`) 
WHERE (`created_at` BETWEEN '2014-08-01' AND '2014-08-31') 
   OR (`returned_at` BETWEEN '2014-08-01' AND '2014-08-31')