这两个语句在逻辑上是等价的:
SELECT * FROM table WHERE someColumn BETWEEN 1 AND 100
SELECT * FROM table WHERE someColumn >= 1 AND someColumn <= 100
一个与另一个相比,是否存在潜在的性能优势?
这两个语句在逻辑上是等价的:
SELECT * FROM table WHERE someColumn BETWEEN 1 AND 100
SELECT * FROM table WHERE someColumn >= 1 AND someColumn <= 100
一个与另一个相比,是否存在潜在的性能优势?
没有实际的好处,只是一种语法糖。
使用BETWEEN
版本,在某些情况下可以避免函数重新计算。
DECLARE @Table TABLE(
ID INT
)
SELECT *
FROM @Table
WHERE ID >= 1 AND ID <= 100
SELECT *
FROM @Table
WHERE ID BETWEEN 1 AND 100
当你检查执行计划时,你应该注意到它完全相同。
哦,这里有一个令人惊讶的结果。我这里没有SQL Server,所以我在Postgres中尝试了一下。显然,免责声明适用:这不一定会产生相同的结果,您的情况可能会有所不同,请在使用之前咨询医生。但是...
我只是用两种不同的方式编写了一个简单的查询:
select *
from foo
where (select code from bar where bar.barid=foo.barid) between 'A' and 'B'
并且
select *
from foo
where (select code from bar where bar.barid=foo.barid)>='A'
and (select code from bar where bar.barid=foo.barid)<='B'
令我惊讶的是,两者的运行时间几乎完全相同。当我进行 EXPLAIN PLAN 时,它们给出了相同的结果。具体来说,第一个查询对 bar 进行了两次查找,一次是 >= 测试,另一次是 <= 测试,就像第二个查询一样。
结论:在 Postgres 中,BETWEEN 确实只是语法糖。
个人而言,我经常使用它,因为它对读者更清晰,特别是如果被测试的值是表达式。弄清楚两个复杂表达式是相同的可能是一个非常棘手的练习。即使它们不相同,弄清楚两个复杂表达式应该是相同的甚至更加困难。
第一种写法没有性能上的优势,只是更容易阅读和编写。
哦,但你们都是在讨论搜索值在where子句左侧的情况。
有人看过当它在子句的另一侧时的差异吗?
SELECT * FROM table WHERE @date BETWEEN someCol1 AND someCol2
SELECT * FROM table WHERE someCol1 >= @date AND someCol2 <= @date