SQL中OR语句中括号的使用方式

20

想知道为什么在这个SQL语句中要使用括号:

查询格式如下:

查询名字以A或B开头的员工的姓名、位置和部门。(从法语的粗略翻译)

我的回答是:

SELECT service.nom_serv, localite.ville, localite.departemen
FROM service, localite, employe
WHERE service.code_loc=localite.code_loc
AND employe.service=service.code_serv
AND ((employe.nom LIKE 'A%') OR (employe.nom LIKE 'B%'))

基本上,对于WHERE子句中的最后一个AND,如果我不使用括号,能否让SQL为我选择名字以A或B开头的员工?在那种情况下,放置括号有什么区别?为什么要双重使用括号?或者是为了优先处理最后一个子句中的OR,因为其前面有一个AND?


请阅读本文以了解优先级、逻辑运算符AND、OR以及括号的作用。https://technet.microsoft.com/zh-cn/library/ms186992(v=sql.105).aspx - SKARVA Bodavula
3个回答

26

请查看 SQL Server 中的操作符优先级(尽管您没有具体说明,但我想它对所有关系型数据库管理系统都是一样的)。这意味着没有括号的 AND 会比 OR 具有更高的绑定力。

因此,在您的特定情况下,没有括号的情况下,条件是:

  • employe.service=service.code_serv AND employe.nom LIKE 'A%'

或者

  • employe.nom LIKE 'B%'

评估顺序在 SQL 中故意没有指定,这允许许多可能重新排序的语言,并不像保证从左到右或按优先级排序的语言那样限制顺序。


为了以通俗易懂的方式理解括号的重要性,建议参考https://allthingssql.com/sql-parentheses/。 - Midhun Kumar Singh Alluru
添加 https://allthingssql.com/sql-parentheses/ 以便以通俗易懂的方式理解括号的重要性。 - Midhun Kumar Singh Alluru

16

你使用它来指定子句的分组,而不是优先级。SQL不允许您指定优先级,因为优化器会为您创建最佳优先级。

AND ()

将两个OR条件放在一个语句中。因此,如果任意一个条件为真,则AND也为真。内部括号不是必需的,但有助于可视化分离。

没有外部括号,它将允许任何具有最终条件为真的情况。


2

这里有多余的括号。在数学中,添加括号是为了澄清逻辑。在这种情况下,如果您删除所有括号,将得到错误的答案。您所拥有的是一个 AND ((b) OR (c))。删除所有括号会将其从 (a OR b) AND (a OR c) 变成 (a AND b) OR c,这是不正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接