为什么在没有它的情况下使用BETWEEN运算符?

时间:2009-12-25 08:42:26

标签: sql between

如下面的两个查询所示,我们发现它们都运行良好。然后我很困惑为什么我们应该使用BETWEEN,因为我发现BETWEEN在w3school

中找到的不同数据库中表现不同
SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;

SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;

11 个答案:

答案 0 :(得分:32)

BETWEEN可以帮助避免对表达式进行不必要的重新评估:

SELECT  AVG(RAND(20091225) BETWEEN 0.2 AND 0.4)
FROM    t_source;

---
0.1998

SELECT  AVG(RAND(20091225) >= 0.2 AND RAND(20091225) <= 0.4)
FROM    t_source;

---
0.3199

t_source只是一个包含1,000,000条记录的虚拟表。

当然这可以使用子查询来解决,但在MySQL中效率较低。

当然,BETWEEN更具可读性。在查询中使用它需要3次才能永远记住语法。

SQL ServerMySQL中,针对具有非领先LIKE的常量的'%'也是一对>=和{{1}的简写}}:

<

但是,SET SHOWPLAN_TEXT ON GO SELECT * FROM master WHERE name LIKE 'string%' GO SET SHOWPLAN_TEXT OFF GO |--Index Seek(OBJECT:([test].[dbo].[master].[ix_name_desc]), SEEK:([test].[dbo].[master].[name] < 'strinH' AND [test].[dbo].[master].[name] >= 'string'), WHERE:([test].[dbo].[master].[name] like 'string%') ORDERED FORWARD) 语法更清晰。

答案 1 :(得分:16)

当比较的表达式是一个复杂的计算而不仅仅是一个简单的列时,使用BETWEEN有额外的优点;它节省了两次复杂表达的写法。

答案 2 :(得分:5)

具有“between”的版本更易于阅读。如果我要使用第二个版本,我可能会把它写成

5000 <= salary and salary <= 15000

出于同样的原因。

答案 3 :(得分:5)

T-SQL中的BETWEEN支持NOT运算符,因此您可以使用

之类的结构
WHERE salary not between 5000 AND 15000; 

在我看来,人类更清楚

WHERE salary < 5000 OR salary > 15000;

最后,如果您只输入一次列名,则可以减少出错的机会

答案 4 :(得分:2)

就我个人而言,我不会使用BETWEEN,因为在给定的例子中,似乎没有明确定义是否应该包含或排除用于约束条件的值:

SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;

范围可以包含5000和15000,或者可以排除它们。

从语法上来说,我认为它应该排除它们,因为值本身在给定数字之间 。但我的观点正是如此,而使用>=等运算符非常具体。并且不太可能在数据库之间或在相同的增量/版本之间进行更改。


已编辑以回应Pavel和Jonathan的评论。

正如Pavel所说,ANSI SQL( http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)早在1992年就要求终点应在返回日期内考虑并等同于X >= lower_bound AND X <= upper_bound:< / p>

  

8.3

     Function

     Specify a range comparison.

     Format

     <between predicate> ::=
          <row value constructor> [ NOT ] BETWEEN
            <row value constructor> AND <row value constructor>


     Syntax Rules

     1) The three <row value constructor>s shall be of the same degree.

     2) Let respective values be values with the same ordinal position
        in the two <row value constructor>s.

     3) The data types of the respective values of the three <row value
        constructor>s shall be comparable.

     4) Let X, Y, and Z be the first, second, and third <row value con-
        structor>s, respectively.

     5) "X NOT BETWEEN Y AND Z" is equivalent to "NOT ( X BETWEEN Y AND
        Z )".

     6) "X BETWEEN Y AND Z" is equivalent to "X>=Y AND X<=Z".

答案 5 :(得分:2)

我投票@Quassnoi - 正确是一个巨大的胜利。

我通常发现文字比语法符号更有用,例如&lt;,&lt; =,&gt;,&gt; =,!=等等。是的,我们需要(更好,更准确)的结果。至少我摆脱了错误解释和视觉上回复符号含义的可能性。如果您使用&lt; =并感觉来自您的选择查询的逻辑上不正确的输出,您可能会徘徊一段时间并且只得到您写的&lt; =代替&gt; = [视觉误解释?]的结论。希望我很清楚。

我们不是在缩短代码(以及使代码更高级),这意味着更简洁,更易于维护吗?

SELECT * 
FROM emplyees 
WHERE salary between 5000 AND 15000; 



SELECT * 
FROM emplyees 
WHERE salary >= 5000 AND salary <= 15000; 

第一个查询仅使用10个单词,第二个查询使用12个单词!

答案 6 :(得分:1)

如果端点是包含端点,则BETWEEN是首选语法。

对列的较少引用意味着在更改时更少的更新位置。这是工程原理,较少的东西意味着更少的东西可以打破。

这也意味着有人为包括OR之类的东西放置错误括号的可能性较小。 IE:

WHERE salary BETWEEN 5000 AND (15000
  OR ...)

...如果您将括号放在BETWEEN语句的AND部分周围,则会出现错误。对战:

WHERE salary >= 5000
 AND (salary <= 15000
  OR ...)

...当有人查看从查询返回的数据时,您才会知道存在问题。

答案 7 :(得分:0)

从语义上讲,这两个表达式具有相同的结果。

但是,BETWEEN是单个谓词,而不是两个与AND结合的比较谓词。根据RDBMS提供的优化程序,单个谓词可能比两个谓词更容易优化。

虽然我希望大多数现代RDBMS实现应该以相同的方式优化这两个表达式。

答案 8 :(得分:0)

更糟糕的是,如果它是

  SELECT id FROM entries 
  WHERE 
     (SELECT COUNT(id) FROM anothertable WHERE something LEFT JOIN something ON...) 
     BETWEEN entries.max AND entries.min;

使用您的语法重写这个,而不使用临时存储。

答案 9 :(得分:-1)

我最好使用第二个,因为你总是知道它是&lt; =或&lt;

答案 10 :(得分:-1)

在SQL中,我同意BETWEEN基本上是不必要的,并且可以使用5000 <= salary AND salary <= 15000在语法上进行模拟。它也是有限的;我经常想要应用包含下限和独占上限:@start <= when AND when < @end,这是BETWEEN无法做到的。

OTOH,如果被测试的值是复杂表达式的结果,则BETWEEN很方便。

如果SQL和其他语言遵循Python在使用适当的数学符号方面的领先优势,那就太好了:5000 <= salary <= 15000

一个小技巧会让你的代码更具可读性:使用&lt;和&lt; =优先于&gt;和&gt; =。

相关问题