143

在 SQL Server 2000 和 2005 中:

  • WHERE这两个条款有什么区别?
  • 我应该在哪些情况下使用哪一个?

查询一:

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,因此查询在语法上是错误的)

4

10 回答 10

147

它们是相同的:BETWEEN是包含两个值 ( EventDate >= '10/15/2009' and EventDate <= '10/19/2009') 的问题中较长语法的简写。

BETWEEN在不起作用的地方使用另一种更长的语法,因为不应包含一个或两个值,例如

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/19/2009'

(注意<而不是<=第二种情况。)

于 2009-10-27T11:40:54.660 回答
42

他们是一样的。

需要注意的一件事是,如果您对 DATETIME 使用它,则结束日期的匹配将是一天的开始:

<= 20/10/2009

不一样:

<= 20/10/2009 23:59:59

(它将匹配<= 20/10/2009 00:00:00.000

于 2009-10-27T11:41:43.707 回答
16

虽然BETWEEN易于阅读和维护,但我很少推荐使用它,因为它是一个封闭的间隔,并且如前所述,这可能是日期的问题——即使没有时间组件。

例如,在处理月度数据时,比较日期通常很常见BETWEEN first AND last,但实际上这通常更容易编写dt >= first AND dt < next-first(这也解决了时间部分问题) - 因为确定last通常比确定next-first(减去一天)长一步.

此外,另一个问题是下限和上限确实需要以正确的顺序指定(即BETWEEN low AND high)。

于 2009-10-27T13:24:19.070 回答
4

通常,没有区别 -BETWEEN并非所有 RDBMS 平台都支持该关键字,但如果支持,则两个查询应该是相同的。

由于它们是相同的,因此在速度或其他方面确实没有区别 - 使用对您来说更自然的那个。

于 2009-10-27T11:41:18.027 回答
4

正如@marc_s、@Cloud 等人所提到的。对于封闭范围,它们基本相同。

但是任何小数时间值都可能导致封闭范围(大于或等于和小于或等于)的问题,而不是半开放范围(大于或等于和小于)在结束值之后最后可能的瞬间。

因此,为避免查询应重写为:

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

由于BETWEEN不适用于半开间隔,我总是仔细查看使用它的任何日期/时间查询,因为它可能是一个错误。

于 2009-10-27T11:52:57.540 回答
4

我有一点偏好,BETWEEN因为它让读者立即清楚您正在检查一个字段的范围。如果您的表中有类似的字段名称,则尤其如此。

如果,比如说,我们的桌子有 atransactiondate和 a 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,当然,这将是一个语法错误并立即修复。

于 2009-10-27T13:17:56.370 回答
3

我认为唯一的区别是每个查询的语法糖量。BETWEEN 只是一种巧妙的说法,与第二个查询完全相同。

可能存在一些我不知道的 RDBMS 特定差异,但我真的不这么认为。

于 2009-10-27T11:41:32.660 回答
2

逻辑上根本没有区别。在性能方面——通常,在大多数 DBMS 上——根本没有区别。

于 2009-10-27T11:42:21.240 回答
1

免责声明:以下所有内容仅是轶事,直接来自我的个人经验。欢迎任何愿意进行更严格的实证分析的人来执行它,如果我愿意的话,可以投反对票。我也知道 SQL 是一种声明性语言,你不应该在编写它时考虑如何处理你的代码,但是,因为我珍惜我的时间,所以我会这样做。

有无限的逻辑等效语句,但我会考虑三个(ish)。

案例1:标准订单中的两个比较(评估订单固定)

A >= MinBound AND A <= MaxBound

案例2:语法糖(作者未选择评估顺序)

MinBound 和 MaxBound 之间的一个

案例 3:以受过教育的顺序进行两次比较(在编写时选择评估顺序)

A >= MinBound AND A <= MaxBound

或者

A <= MaxBound AND A >= MinBound

根据我的经验,案例 1 和案例 2 在性能上没有任何一致或显着的差异,因为它们不了解数据集。

但是,案例 3 可以大大缩短执行时间。具体来说,如果您正在处理大型数据集并且碰巧对A是否更有可能大于MaxBound或小于MinBound有一些启发式知识,您可以通过使用案例 3 并排序比较来显着提高执行时间因此。

我的一个用例是查询具有非索引日期的大型历史数据集以获取特定时间间隔内的记录。在编写查询时,我会很好地了解在指定间隔之前或之后是否存在更多数据,并且可以相应地对我的比较进行排序。根据数据集的大小、查询的复杂性以及第一次比较过滤的记录数量,我将执行时间缩短了一半。

于 2019-02-07T16:00:12.370 回答
0

在这种情况下col BETWEEN ... AND ...col <= ... and col >= ...是等价的。


SQL 标准还定义了T461 Symmetric BETWEEN 谓词

 <between predicate part 2> ::=
 [ NOT ] BETWEEN [ ASYMMETRIC | SYMMETRIC ]
 <row value predicand> AND <row value predicand>

Transact-SQL 不支持此功能。

BETWEEN要求对值进行排序。例如:

SELECT 1 WHERE 3 BETWEEN 10 AND 1
-- no rows

<=>

SELECT 1 WHERE 3 >= 10 AND 3 <= 1
-- no rows

另一方面:

SELECT 1 WHERE 3 BETWEEN SYMMETRIC 1 AND 10;
-- 1

SELECT 1 WHERE 3 BETWEEN SYMMETRIC 10 AND 1
-- 1

它与正常工作完全一样,BETWEEN但在对比较值进行排序之后。

db<>小提琴演示

于 2020-05-12T11:28:09.313 回答