【问题标题】:How is where clause in SQL evaluated? [duplicate]如何评估 SQL 中的 where 子句? [复制]
【发布时间】:2013-03-01 21:28:25
【问题描述】:

我想了很多,但一直没有找到答案。在我不知道如何评估 SQL 查询的 where 子句中的条件的情况下,我发现了自己。可以肯定的是,我一直使用括号来使其更具可读性和易于理解。我认为有时使用括号来增加可读性是一种很好的做法,即使它可能不是必需的。

考虑以下查询

SELECT * 
FROM mytable 
WHERE name='Anton' 
  AND lastname='Gildebrand' 
   OR age > 18 
  AND country='Sweden'

我想这个查询实际上等于

SELECT * 
FROM mytable 
WHERE name='Anton' 
 AND (lastname='Gildebrand' OR (age > 18 AND country='Sweden'))

这是正确的吗?或者如何评估条件? 和不同的数据库引擎有区别吗?

【问题讨论】:

  • 这就是为什么使用OR 也应该意味着使用括号;只是为了可读性。

标签: sql


【解决方案1】:
SELECT * FROM mytable
WHERE name='Anton' AND lastname='Gildebrand' OR age > 18 AND country='Sweden'

等于:

SELECT * FROM mytable
WHERE (name='Anton' AND lastname='Gildebrand') OR (age > 18 AND country='Sweden')

来源:TSQLMySQLOraclePostgreSQL

【讨论】:

  • 确定对此有信心吗? Operator precedenceAND 然后是 OR
  • @AarolamaBluenk:是的,ANDOR 之前被评估。我用一些链接更新了答案。
  • @AarolamaBluenk 。 . .双是的。这在 ANSI 标准以及许多编程语言中都有明确规定。
  • 酷,没想到那个。每个人似乎都同意你的答案,所以我会接受它作为答案:)
【解决方案2】:

如果您在谈论andor,则在没有括号的情况下首先评估and。与数学中的*+ 相同。

这些规则不依赖于 SQL 实现。

【讨论】:

  • 顺便说一句,那个链接根本没有提到运算符优先级,我可以看到。该文件的严重失败,IMO。 (和 w3schools 的课程差不多。)不过,你的答案是正确的。
  • 我同意@Andrew,这个答案是正确的,但链接几乎没用。
  • @ypercube - 删除链接
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 2021-10-27
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多