Sql WHERE子句中是否需要内括号?或任何地方
在WHERE部分或任何你有多个条件的地方,比如or,我知道需要外括号,但是内括号是吗 例如,我的假设是Sql WHERE子句中是否需要内括号?或任何地方,sql,sql-server,parentheses,Sql,Sql Server,Parentheses,在WHERE部分或任何你有多个条件的地方,比如or,我知道需要外括号,但是内括号是吗 例如,我的假设是 WHERE A.Title='EMP' AND ( (A.NAME='Mike') OR (A.ID='9001') ) 和写作一样 WHERE A.Title='EMP' AND ( A.NAME='Mike' OR A.ID='9001' ) 然而,如果我们去掉外括号,那么我知道查询将不同 例如: WHERE A.Title='EMP' AND (A.NAME='Mike') OR (
WHERE A.Title='EMP'
AND ( (A.NAME='Mike') OR (A.ID='9001') )
和写作一样
WHERE A.Title='EMP'
AND ( A.NAME='Mike' OR A.ID='9001' )
然而,如果我们去掉外括号,那么我知道查询将不同
例如:
WHERE A.Title='EMP'
AND (A.NAME='Mike') OR (A.ID='9001')
及
两者都是一样的,但根本不是我们想要的
在前两种情况下,数据的计算是否有可能不同?这与数学中的情况类似
2 + 3 * 4 ==> 14
与
2 + (3 * 4) ==> 14
((A.Title='EMP') AND (A.NAME='Mike')) OR (A.ID='9001')
因为乘法的优先级高于加法。如果你想在乘法之前做加法,你必须加括号
(2 + 3) * 4 ==> 20
在SQL中,和
的优先级高于或
<代码>=作为比较运算符,其优先级高于两者。因此,不需要内括号,因为=
将始终首先执行。例如
A.Title='EMP' AND A.NAME='Mike' OR A.ID='9001'
与
2 + (3 * 4) ==> 14
((A.Title='EMP') AND (A.NAME='Mike')) OR (A.ID='9001')
仅当要在和
之前执行或
时,才需要使用括号(即使它首先出现在表达式中):
只有当运算符具有相同的优先级时,才会从左到右对其求值
有关完整的优先级列表,请参见:这就像在数学中一样
2 + 3 * 4 ==> 14
与
2 + (3 * 4) ==> 14
((A.Title='EMP') AND (A.NAME='Mike')) OR (A.ID='9001')
因为乘法的优先级高于加法。如果你想在乘法之前做加法,你必须加括号
(2 + 3) * 4 ==> 20
在SQL中,和
的优先级高于或
<代码>=作为比较运算符,其优先级高于两者。因此,不需要内括号,因为=
将始终首先执行。例如
A.Title='EMP' AND A.NAME='Mike' OR A.ID='9001'
与
2 + (3 * 4) ==> 14
((A.Title='EMP') AND (A.NAME='Mike')) OR (A.ID='9001')
仅当要在和
之前执行或
时,才需要使用括号(即使它首先出现在表达式中):
只有当运算符具有相同的优先级时,才会从左到右对其求值
有关完整的优先级列表,请参见:“两种条件之间的数据计算结果是否可能不同?”否。将单个布尔表达式括在括号内不会改变任何内容。@Larnu谢谢。有人告诉我其他事情,我必须确定。
如果A.NAME='Mike'或A.ID='9001'
,SQL不是Lisp。@Mike SMT有人告诉我其他事情
具体是什么?这可能与你的想法无关<在二进制逻辑中,code>和的优先级高于或
,因此在几乎所有语言中,a或B和C与(a或B)和C
不同。在数学上,它和加法和乘法没有什么不同。即使使用相同的符号,例如+
对于ORPlease,建议查看此顶部关于“两个条件之间的数据求值是否可能不同?”的内容。否。将单个布尔表达式括在括号内不会改变任何内容。@Larnu谢谢。有人告诉我其他事情,我必须确定。如果A.NAME='Mike'或A.ID='9001'
,SQL不是Lisp。@Mike SMT有人告诉我其他事情
具体是什么?这可能与你的想法无关<在二进制逻辑中,code>和
的优先级高于或
,因此在几乎所有语言中,a或B和C与(a或B)和C
不同。在数学上,它和加法和乘法没有什么不同。即使使用了相同的符号,例如,对于ORPlease,建议查看此顶部,我知道这是正确的。这个人说,首先需要内部帕伦进行评估。像这样的和((A.NAME='Mike')或(A.ID='9001'))
,我不同意,但我不得不质疑我是否错了,所以我发布了这样的帖子:虽然不需要,但清晰性很重要,所以你可以把它们放在更复杂的条款中以便于阅读(特别是在and和OR混合的情况下,你可能会在没有任何参数的情况下得到你想要的,但你应该尝试向未来的读者澄清)。对,我知道。这个人说需要内部参数进行评估或首先评估。像这样和((A.NAME='Mike')或(A.ID='9001'))
我不同意,但我不得不质疑我是否错了,所以我在so上发布了:虽然不需要,但清晰性很重要,所以你可以在更复杂的子句中加入它们以提高可读性(特别是在and和OR混合的情况下,你可以在没有任何参数的情况下得到你想要的,但你应该尝试为未来的读者澄清)。