SQL查询表达式的优先顺序

时间:2012-04-20 10:11:48

标签: sql sql-server database

我正在尝试研究如何运行SQL查询并且遇到了一些绊脚石。

如果使用类似于以下的where子句:

A OR B AND C

这可能意味着以下任何一个

(A OR B)和C

OR(B和C)

在大多数情况下,结果将是相同的,但如果要查询的集合仅包含{A},则第一个变量将返回空结果集,第二个变量将返回{A}。事实上,SQL确实返回了1个结果。

有没有人知道(或有链接)有助于我理解查询构建方式的任何见解?

番茄酱

4 个答案:

答案 0 :(得分:2)

根据MSDN的顺序如下:

  
      
  1. 〜(按位NOT)

  2.   
  3. (*)(乘),/(分部),%(模数)

  4.   
  5. (+)(正), - (负),+(加),(+连接), - (减),& (按位AND),^(按位异或),| (按位OR)

  6.   
  7. =,>,<,> =,< =,<>,!=,!>,!< (比较运营商)

  8.   
  9. 不是

  10.   
  11.   
  12. ALL,ANY,BETWEEN,IN,LIKE,或某些

  13.   
  14. =(作业)

  15.   

答案 1 :(得分:2)

AND优先级高于OR的知识(来自文档)中,您应该以联合正常形式编写WHERE子句的谓词(" a AND条款的附件")。

如果意图是

( A OR B ) AND C

然后写下来,一切都很好。

但是,如果意图是

A OR ( B AND C )

然后我建议你应用导致联合正常形式的distributive rewrite law,即

( P AND Q ) OR R   <=>  ( P OR R ) AND ( Q OR R )    

在你的情况下:

A OR ( B AND C ) <=>  ( A OR B ) AND ( A OR C )

答案 2 :(得分:0)

ANDOR有不同的先行。

请参阅Precedence Level

答案 3 :(得分:0)

对于SQL-Server(这是您的标记),这里的优先级为http://msdn.microsoft.com/en-us/library/ms190276.aspx但是.. 如果你担心给定的确切结果集,你应该开始使用()子集。