SQL:为什么BETWEEN运算符是包含的?

4

这是我在这里发布的第一篇文章。 :)

我的老师让我写一个查询来显示年龄在18岁到20岁之间的学生姓名。

我写了:

SELECT * FROM students WHERE age BETWEEN 18 AND 20;

我感觉:

SELECT * FROM students WHERE age = 19; --should be an equivalent statement

我的期望是18到20岁之间是指19岁,但包括了18岁和20岁。这对我来说很荒谬。是否有理由使BETWEEN包括上限和下限?
在SQL中,人们要求介于某些值之间,但希望包括这些值,这是正常的吗?

3
之所以具有包容性,是因为标准如此规定。标准本身不必提供充分的解释:它们的目的是定义行为。 - zerkms
我希望BETWEEN操作符是包含的,并且在实现时会这样解释。 - Bruno Bukavu Thai
2
在英语中,“between”也是包含的。如果有人要求我列出年龄在18岁和20岁之间的所有人,我会包括18岁和20岁的人。你确定你的老师不是这样问问题的吗? - MikeBeaton
@MikeBeaton 有时候在英语中是包含的,但在我看来更常见的情况是不包含。相关讨论请参考https://english.stackexchange.com/questions/118402/when-is-between-inclusive-and-when-exclusive - Martin Smith
好的,同意,它可以是两者兼而有之。也许在英式英语中更常见包含范围,因为美式英语使用“through”表示包含范围,所以不使用“through”可能暗示你并不是指“through”?所以如果被美式英语的人阅读,也许老师的问题会显得更加模糊不清一些? - MikeBeaton
也许老师真的很聪明,想让你注意到在英语中,“between”是有歧义的,并学习它在SQL中的具体含义?!! - MikeBeaton
1个回答

5

是的,BETWEEN在ANSI SQL中定义的两个边界都是包含的,在我所知道的所有数据库中也是这样。

Postgres也不例外:

BETWEEN谓词简化了范围测试:

a BETWEEN x AND y

等效于

a >= x AND a <= y

你的老师很有可能也是这样理解的。

如果你想使用非包含的谓词,那么你需要明确说明:

SELECT * FROM students WHERE age > 18 AND age < 20

1
老实说,一个技术任务应该被解释得更加准确,以免给人留下任何误解的空间。你的老师应该以同样的方式理解这一点。 - zerkms
1
谢谢,这确实有点奇怪。现在我知道了,当然会始终将BETWEEN视为<=或>=,但这不是我预期的。 - UnderPaidMathematician
我同意zerkms,说实话,我不知道交作业时会有什么期望。感谢你的所有帮助! - UnderPaidMathematician
也许你的老师有点心机,知道在Postgres中BETWEEN的确切含义,但却以这种方式表达,希望你可能会做一些奇怪的事情。比如查阅完全详细解释了它的文档。只需在Google上搜索“postgres between”。 - Belayer
是的,我立刻注意到了,但老师在回答中使用了SQL中的"between",所以我认为他弄错了。不管怎样,这是一门在线课程,我还是学到了重要的东西。 - UnderPaidMathematician

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接