Mysql Where子句中的奇括号行为

Mysql Where子句中的奇括号行为,mysql,boolean-operations,Mysql,Boolean Operations,设置: MySQL 5.7.14(谷歌SQL) 说明: 在下面的场景中,似乎我在where子句中得到了一些错误的匹配,其中我没有使用括号。但添加括号确实会产生正确的结果 此查询确实返回tsd.StatusID=3的结果(错误): 虽然此查询不返回和tsd.StatusID=3的结果(正确): 问题: 虽然我觉得我完全理解带括号的查询为什么有效。我的问题是,为什么没有括号的返回StatusID==3的记录?我认为没有括号的任何函数顺序,和tsd.StatusID!=3无论前面的或如何,子句都将应用

设置:

MySQL 5.7.14(谷歌SQL)

说明:

在下面的场景中,似乎我在where子句中得到了一些错误的匹配,其中我没有使用括号。但添加括号确实会产生正确的结果

此查询确实返回tsd.StatusID=3的结果(错误):

虽然此查询不返回和tsd.StatusID=3的结果(正确):

问题:

虽然我觉得我完全理解带括号的查询为什么有效。我的问题是,为什么没有括号的返回StatusID==3的记录?我认为没有括号的任何函数顺序,
和tsd.StatusID!=3无论前面的
如何,子句都将应用于每个匹配

A OR B AND C
你会怎么想?我是误解了,还是MySQL在这里的行为不一致

p.S.


仅供参考,是的,需要以这种方式格式化Where子句有一个前端应用程序原因。例如,
tsee.CCID IN(4590)
tsee.CCID=4590
相反,该解释与
无关,比如NULL
IN()

布尔表达式遵循运算符优先级的顺序,就像算术一样

在算术中,您可能记得乘法的优先级高于加法:

A + B * C
如果没有括号,其工作原理与以下内容完全相同:

A + (B * C)
如果要首先计算加法,则必须使用括号覆盖默认运算符优先级:

(A + B) * C
(A OR B) AND C
类似地,在布尔表达式中,
的优先级高于

A OR B AND C
工作原理如下:

A OR (B AND C)
如果要首先计算
,则必须使用括号覆盖默认运算符优先级:

(A + B) * C
(A OR B) AND C
这如何解释你所看到的

WHERE tsee.CCID IN (4590) OR tsee.CCID LIKE null
AND tsd.StatusID != 3
这就像你做了:

WHERE tsee.CCID IN (4590) OR (tsee.CCID LIKE null
AND tsd.StatusID != 3)

因此,如果它找到一个CCID为4590的行,则该行满足整个WHERE子句,因为
true或(任何)
仍然为true。

“解释与LIKE NULL或IN()无关。”100%正确。我试图避免人们关注问题的这一部分。很好的解释。我认为在没有括号的情况下,优先级为零,每个计算都是单独处理的。。。。这意味着每次评估都是按顺序进行的,并且独立于以前的评估。这意味着即使该子句匹配(4590)中的'infailed'Like'NULL。它仍然必须通过“和tsd.StatusID!”3'子句。我所知道的所有编程语言都有运算符优先级,包括SQL。