从下面两个查询结果可以看出,它们都很好地工作。 那么我很困惑为什么我们需要使用BETWEEN,因为我发现在不同的数据库中,BETWEEN的行为是不同的,这可以在w3school上找到。
SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;
SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;
从下面两个查询结果可以看出,它们都很好地工作。 那么我很困惑为什么我们需要使用BETWEEN,因为我发现在不同的数据库中,BETWEEN的行为是不同的,这可以在w3school上找到。
SELECT *
FROM employees
WHERE salary BETWEEN 5000 AND 15000;
SELECT *
FROM employees
WHERE salary >= 5000
AND salary <= 15000;
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
更易读。将其用于查询需要记住语法,而且需要三次操作。
在SQL Server
和MySQL
中,对常量使用非前导'%'
的LIKE
也是一种缩写形式,代表一对>=
和<
。
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)
然而,LIKE
语法更易读。
当进行比较的表达式是复杂计算而不仅仅是简单列时,使用BETWEEN具有额外的优点;它可以避免重复编写这个复杂的表达式。
5000 <= salary and salary <= 15000
5000 <= 薪水 and 薪水 <= 15000
应该使用BETWEEN。 :-) - Bob Jarvis - Слава УкраїніT-SQL中的BETWEEN支持NOT运算符,因此您可以使用以下结构:
WHERE salary not between 5000 AND 15000;
WHERE salary < 5000 OR salary > 15000;
最后,如果您只输入列名一次,则减少犯错的机会
BETWEEN
,因为在你给出的例子中似乎没有明确的定义它是否应该包括或排除用于界定条件的值。SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;
X >= lower_bound AND X <= upper_bound
。
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".
我投票支持@Quassnoi-正确性是一个巨大的胜利。
我通常发现文字比诸如<、<=、>、>=、!=等语法符号更有用。是的,我们需要(更好、准确)的结果。至少我可以摆脱视觉上误解和反转符号含义的可能性。如果您使用<=并从选择查询中得到逻辑不正确的输出,您可能会浪费一些时间,并得出结论,即您在<=的位置上写了>= [视觉误解?]。希望我说得清楚。
我们不是在缩短代码(同时使其看起来更高级),这意味着更简洁易于维护吗?
SELECT *
FROM emplyees
WHERE salary between 5000 AND 15000;
SELECT *
FROM emplyees
WHERE salary >= 5000 AND salary <= 15000;
第一次查询只使用了10个单词,而第二次则使用了12个单词!
BETWEEN
是首选语法。WHERE salary BETWEEN 5000 AND (15000
OR ...)
如果你在BETWEEN语句的AND部分加上括号,就会出现错误。相比之下:
WHERE salary >= 5000
AND (salary <= 15000
OR ...)
...只有当有人审查从查询返回的数据时,您才会知道问题存在。
如果它更糟糕
SELECT id FROM entries
WHERE
(SELECT COUNT(id) FROM anothertable WHERE something LEFT JOIN something ON...)
BETWEEN entries.max AND entries.min;
请使用您的语法重写此代码,而不使用临时存储。
BETWEEN
是一个单一的谓词,而不是两个与AND
组合的比较谓词。根据您的RDBMS提供的优化器,单个谓词可能比两个谓词更容易优化。我最好使用第二个,因为你总是知道它是 <= 还是 <