如下面的两个查询所示,我们发现它们都运行良好。然后我很困惑为什么我们应该使用BETWEEN,因为我发现BETWEEN在w3school
中找到的不同数据库中表现不同SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;
SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;
答案 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 Server
和MySQL
中,针对具有非领先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; =。