每当您编写一个需要过滤掉一系列值的行的查询时,我应该使用BETWEEN
子句还是<=
和>=
?
哪一个性能更好?
答案 0 :(得分:6)
都不是。他们创建完全相同的执行计划。
我使用它们的时间不取决于性能,而取决于数据。
如果数据是离散值,那么我使用BETWEEN
...
x BETWEEN 0 AND 9
但是,如果数据是连续值,那么这不能很好地运作......
x BETWEEN 0.000 AND 9.999999999999999999
相反,我使用>= AND <
...
x >= 0 AND x < 10
有趣的是,>= AND <
技术实际上适用于 连续和离散数据类型。所以,一般来说,我很少使用BETWEEN
。
答案 1 :(得分:4)
此外,请勿将BETWEEN
用于日期/时间范围查询。
以下内容真正意味着什么?
BETWEEN '20120201' AND '20120229'
有些人认为这意味着从2月29日开始随时获取所有数据,包括所有数据。以上内容转化为:
BETWEEN '20120201 00:00:00.000' AND '20120229 00:00:00.000'
因此,如果在午夜之后的任何时间有数据,那么您的报告将不完整。
人们也会尝试聪明并选择当天的“结束”:
BETWEEN '00:00:00.000' AND '23:59:59.997'
如果数据类型为datetime
,则有效。如果是smalldatetime
,则范围的结尾会被四舍五入,并且您可能会包含第二天您不想要的数据。如果是datetime2
,您实际上可能会错过一天中最后2毫秒内发生的一小部分数据。在大多数情况下,统计上不相关,但如果查询错误,则查询错误。
因此,对于日期范围查询,我总是强烈建议使用开放式范围,例如:报告2月份WHERE
条款将在“2月1日或之后以及3月1日之前”说明如下:
WHERE date_col >= '20120201' AND date_col < '20120301'
BETWEEN
只能使用date
类型按预期工作,但我仍然更喜欢查询中的开放式范围,因为稍后有人可能会更改该基础数据类型以允许其包含时间。< / p>
我在这里写了很多细节: