You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中BETWEEN等运算符优先级为何低于AND?

T-SQL中AND运算符优先级规则的实际含义

你对这个优先级规则的困惑非常普遍,核心问题是把语法解析阶段的绑定优先级和运行时的表达式求值顺序搞混了。

首先说最基础的结论:SQL是声明式语言,运算符优先级从来不是用来规定执行先后的,它唯一的作用是给语法解析器定规则:当表达式没加括号、边界不明确时,相邻的关键字、操作数该怎么组合,最终拼出结构正确的逻辑表达式树。至于表达式树拼好之后实际先算哪部分,是查询优化器根据表统计信息、可用索引自主选最高效的路径执行的,和优先级没有直接关系。

你直觉里"必须先算完单个条件才能用AND组合"本身是对的——实际跑查询的时候,确实是先做完LIKE匹配、IN列表判断、BETWEEN范围比较这些单谓词的求值,再做逻辑与、逻辑或的组合判断,这和优先级规则一点都不冲突。

为什么AND优先级会高于BETWEEN/IN/LIKE这类谓词关键字?

最核心的设计原因是要解决BETWEEN语法的关键字歧义:
BETWEEN是SQL里少有的三元谓词,标准写法是表达式 BETWEEN 下界 AND 上界,这里面本身就带一个AND,和连接两个独立条件的逻辑AND写起来完全一模一样。如果把逻辑AND的优先级设得比BETWEEN低,解析器碰到BETWEEN后面的AND时,根本分不出来这个AND是BETWEEN结构的一部分,还是连接下一个条件的逻辑运算符。

举个大家天天写的例子:

WHERE create_time BETWEEN '2024-01-01' AND '2024-06-30' AND is_deleted = 0

要是逻辑AND优先级比BETWEEN低,解析器会默认把BETWEEN之后直到碰到下一个更低优先级关键字(比如OR)之前的所有内容,都算成BETWEEN的上界参数,上面的语句就会被错解析成create_time BETWEEN '2024-01-01' AND ('2024-06-30' AND is_deleted = 0),语义完全错了。

正因为把逻辑AND的优先级设得比BETWEEN高,高优先级运算符会更"紧"地绑定自己两侧的操作数,解析器处理BETWEEN结构时,碰到第一个不属于BETWEEN内部的逻辑AND,就知道BETWEEN的上界到这里结束,不会把后面的条件错归到BETWEEN的参数里。

至于IN、LIKE、ALL、ANY、SOME这些关键字和BETWEEN放在同一优先级层级,只是语法定义上的统一归类:它们都属于谓词构造关键字,本身没有BETWEEN这种关键字冲突的问题,实际写SQL的时候你几乎感知不到它们和AND的优先级差——毕竟比较运算符(=、>、<、>=这些)的优先级比AND还高,会先绑定操作数形成独立的判断谓词,根本不会出现"AND还没等单条件算完就先执行"的情况。

这个优先级规则实际有什么影响?

除了解决前面说的BETWEEN关键字歧义,它对常规写法的SQL几乎不会产生意外语义影响,日常写SQL只要记两个最常用的规则就行:

  • AND优先级永远高于OR,所以a AND b OR c会默认解析为(a AND b) OR c,这和绝大多数编程语言的逻辑运算规则一致
  • 要是拿不准优先级会不会导致解析偏差,直接加括号就好,括号是最高优先级的边界标识,永远不会有歧义

内容的提问来源于stack exchange,提问作者Giuseppe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:54:20