在SQL Server 2000和2005中:
WHERE
条款有什么区别?查询1:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'
查询2:
SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
AND EventDate <='10/18/2009'
(编辑:第二个Eventdate最初缺失,因此查询语法错误)
它们是相同的:BETWEEN
是问题中较长语法的简写。
使用替代更长的语法,其中BETWEEN
不起作用,例如
Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'
(注意<
而不是<=
在第二个条件。)
免责声明:以下所有内容仅为轶事,并直接来自我的个人经历。任何想要进行更经验严谨的分析的人都欢迎如果我这样做,那就进行投票。我也知道SQL是一种声明性语言,你不应该考虑编写代码时如何处理代码,但是,因为我重视我的时间,所以。
有无限逻辑等价的陈述,但我会考虑三个(ish)。
案例1:标准订单中的两次比较(评估顺序已修复)
A> = MinBound AND A <= MaxBound
案例2:句法糖(评价顺序不是作者选择的)
一个BETWEEN MinBound和MaxBound
案例3:受过教育的订单中的两次比较(在写入时选择的评估顺序)
A> = MinBound AND A> = MaxBound
要么
A> = MaxBound AND A> = MinBound
根据我的经验,案例1和案例2在性能上没有任何一致或显着的差异,因为它们是数据集无知的。
但是,案例3可以大大缩短执行时间。具体来说,如果您正在处理大型数据集并碰巧有一些关于A是否更可能大于MaxBound或小于MinBound的启发式知识,则可以通过使用案例3并对比较进行排序来显着提高执行时间因此。
我的一个用例是查询具有非索引日期的大型历史数据集,以查找特定时间间隔内的记录。在编写查询时,我将很好地了解在指定的时间间隔之前或指定的时间间隔之后是否存在更多数据,并且可以相应地对我的比较进行排序。我的执行时间减少了一半,具体取决于数据集的大小,查询的复杂程度以及第一次比较过滤的记录数量。
他们是一样的。
需要注意的一件事是,如果你在DATETIME使用它,那么结束日期的匹配将是一天的开始:
<= 20/10/2009
是不一样的:
<= 20/10/2009 23:59:59
(它会与<= 20/10/2009 00:00:00.000
相匹配)
虽然BETWEEN
易于阅读和维护,但我很少推荐使用它,因为它是一个封闭的间隔,如前所述,这可能是日期的问题 - 即使没有时间组件。
例如,在处理月度数据时,通常比较日期BETWEEN first AND last
,但实际上这通常更容易编写dt >= first AND dt < next-first
(这也解决了时间部分问题) - 因为确定last
通常比确定next-first
长一步(通过减去一天)。
另外,另一个问题是需要以正确的顺序(即BETWEEN low AND high
)指定下限和上限。
通常,没有区别 - 所有RDBMS平台都不支持BETWEEN
关键字,但如果是,则两个查询应该相同。
因为它们是相同的,所以在速度或其他任何方面都没有区别 - 使用对你来说更自然的那个。
正如@marc_s,@ Cloud,et al。它们在封闭范围内基本相同。
但是任何小数时间值都可能导致具有闭合范围(大于或等于和小于或等于)的问题,而不是半开放范围(大于或等于且小于),其后的结束值为最后可能的瞬间。
所以要避免将查询重写为:
SELECT EventId, EventName
FROM EventMaster
WHERE (EventDate >= '2009-10-15' AND
EventDate < '2009-10-19') /* <<<== 19th, not 18th */
由于BETWEEN
不适用于半开放区间,我总是会仔细查看使用它的任何日期/时间查询,因为它可能是一个错误。
我认为唯一的区别是每个查询的语法糖量。 BETWEEN只是一种说法与第二个查询完全相同的方式。
可能存在一些我不了解的RDBMS特定差异,但我并不这么认为。
逻辑上没有任何区别。在大多数DBMS上,性能方面通常都没有差别。
请参阅excellent blog post的Aaron Bertrand,了解为什么要更改字符串格式以及如何在日期范围查询中处理边界值。
我对BETWEEN
略有偏好,因为它让读者立刻明白你正在检查一个范围的一个字段。如果表中有类似的字段名称,则尤其如此。
如果我说,如果我们的桌子有transactiondate
和transitiondate
transactiondate between ...
我立即知道测试的两端都是针对这一领域的。
如果我读
transactiondate>='2009-04-17' and transactiondate<='2009-04-22'
我需要额外的时间来确保两个字段是相同的。
此外,随着时间的推移编辑查询,一个草率的程序员可能会分开这两个字段。我见过很多类似的问题
where transactiondate>='2009-04-17'
and salestype='A'
and customernumber=customer.idnumber
and transactiondate<='2009-04-22'
如果他们用BETWEEN
尝试这个,当然,这将是语法错误并立即修复。