在 SQL Server 中,WHERE 子句的表达式先后顺序没有影响。根据运算符的优先级进行运算,相同优先级的运算符两侧的表达式根据评估的代价多寡来运算,先运算代价小的,后运算代价大的。
如果楼主(或楼主所在的项目)对性能比较敏感,可以通过优化查询策略(如利用索引等)来「引导」Sql Server 的优化器先运算代价小的、后运算代价大的表达式。
All-At-Once Operation(同时操作)概念
SQL 支持这种概念,这意味着统一逻辑查询处理阶段中出现的所有表达式都是同时进行计算的。这一块我们可以分别讲讲 SELECT 子句和 WHERE 子句。
SELECT 子句
以下代码是错误的:
SELECT
orderid,
YEAR(orderdate) AS orderyear,
orderyear + 1 AS nextyear
FROM [DemoDb].dbo.[Orders]
原因是:由于 SELECT 子句中所有列名逻辑上没有先后顺序的,所有表达式都是在同一时刻进行的
WHERE 子句
接下来就是回应本回复最早前那句话的问题了,关于 WHERE 子句,我们首先来看这么一个例子:
SELECT col1, col2
FROM [DemoDb].dbo.[T1]
WHERE col1 <> 0 AND col2 / col1 > 2
假设楼主想找 col2 / col1 值大于 2 的所有 col1 和 col2 集,但又担心除数为零出现错误,所以在之前加上了 col1 <> 0。问题在于,这是否有用?
假设咱