是WHERE子句标准sql中的括号

时间:2013-04-20 16:38:34

标签: sql standards

我目前正在做的课程在WHERE子句中使用括号,如下所示:

SELECT bar
FROM   Foo
WHERE (CurrentState = 'happy');

这是标准的sql吗? 如果不是那么为什么要使用它们

似乎没有在日期和版本中使用我有Darwen的书。


修改

只是为了澄清 - 我指的是1992 sql标准

3 个答案:

答案 0 :(得分:10)

是。您可以使用括号绑定where子句的组件。在您的示例中,这不是必需的,但如果您有多个andor组件,则可能需要使用括号来确保正确的操作顺序,或者只是自我记录查询。

示例1:

select *
from foo
where 
   (class='A' and subclass='B')
   or (class='C' and subclass='D')

在示例1中,并非严格要求parens,因为andor绑定得更紧,但如果您有多个or条件绑定and,那么需要它来获得正确的结果,如下面的例子2所示。

示例2:

select *
from foo
where 
   (class='A' or class='B')
   and (subclass='C' or subclass='D')

我在任何一种情况下都使用它们,因为我不喜欢以与查询优化器相同的方式解析脑中的sql - 我宁愿明确它并且更快地理解意图是什么。

答案 1 :(得分:5)

它们是可选的。它们对更复杂的WHERE语句有意义。

... WHERE (created > '2012-10' AND created < '2013-01') 
OR (modified > '2012-10' AND modified < '2013-01')

答案 2 :(得分:3)

没有。只有当您在声明中AND OR条件时才需要使用它们以避免短路,就像这样:

SELECT...
FROM...
WHERE  col1 > 1 AND col2 < 3 AND col3 >= OR col3 = 1 AND col5 < 1

上述查询会给您带来意想不到的结果,因为它无法确定它将采取的正确条件。在这种情况下,圆括号将帮助您隔离条件,

SELECT...
FROM...
WHERE  col1 > 1 AND col2 < 3 AND (col3 >= OR col3 = 1) AND col5 < 1

顺便说一下,它应该是单引号' '而不是‘ ’