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