2013-04-20 51 views
2

课程括号我目前做的是括号中的WHERE子句,像这样:是在WHERE子句标准的SQL

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

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

似乎没有在日期& Darwen书我使用。


编辑

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

+2

是的,SQL标准允许使用括号。 – 2013-04-20 16:39:53

+1

另一方面,你放在那里的引号没有。 – Mat 2013-04-20 16:42:06

+0

@Mat同意 - 我编辑过 - 这是单引号在doc文件中输入时的样子;我刚刚从doc复制到SO。奇怪的 – whytheq 2013-04-20 16:50:29

回答

3

号他们仅在需要时你有你的发言ANDOR条件下使用避免短路,就像这样:

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

上面的查询将得到é你意想不到的结果,因为它不会确定它将采取的正确条件。 A轮支架将帮助你在这种情况下,隔离条件,

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

的方式,它应该是单引号' '‘ ’

+0

你是什么意思的“号”?问题是“括号中的WHERE子句标准SQL” – Mat 2013-04-20 16:43:51

+0

@Mat他们是标准的SQL? – 2013-04-20 16:45:02

+0

它们可能是有效的,但它们不是标准的。 – 2013-04-20 16:45:03

4

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

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

+1感谢贡献 – whytheq 2013-04-20 16:59:14

7

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

例1:

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

在例1中,括号是没有严格要求,因为and结合比or越紧,但如果你有多个or条件由and绑你需要它得到正确的结果,如下例2所示。

例2:

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

我使用它们在任何情况下,因为我不喜欢解析SQL中我的头以同样的方式查询优化器 - 我宁愿是明确关于它并且更快地理解它的意图是什么。

+0

+1感谢您的信息,但显然当事情变得复杂的布尔逻辑时,我会使用括号,只是想知道为什么我的课程材料在没有AND和OR操作符时使用它们。 – whytheq 2013-04-20 16:56:23

+0

有时课程资料很奇怪。通常,他们会做一些愚蠢的事情,只是为了让你养成教授认为有用的习惯。在这种情况下,你可能会问你的经理为什么他/她认为这很重要。 – PaulProgrammer 2013-04-20 17:00:49