什么是正确的使用方法之间,因为树屋和我的老师对这个问题有不同的答案。
选择1999年至2004年的所有电影。
树屋答:
SELECT * FROM movies WHERE year BETWEEN 1999 AND 2004;教师回答:
SELECT * FROM movies WHERE year >= 1999 AND year <= 2004;哪种方法是正确的?
发布于 2013-12-21 17:20:20
两者在技术上都是正确的。然而,正如你的老师所建议的那样,有理由避免使用between。最简单的是,在英语中,这个词是模棱两可的,可以包括终点,也可以不包括终点。事实上,如果你说一条线上的一个点在另外两个点之间,通常意思是这个点与两个端点不重合。
对于整数来说,这是一个小问题。对于其他数据类型,它变得更加重要。一个特别的问题是日期时间。如果数据库中有一个datetime字段,那么下面的内容将不像您所期望的那样工作:
where datetimefield between '2013-01-01' and '2013-01-02'这将返回2013-01-01年间的所有日期时间值。此外,它将返回一个日期时间值,该值正好位于两个日期之间的午夜。它不会返回2013-01-02年的任何其他值。
我很高兴你的老师认识到了between的缺点。我希望S/他也能解释为什么显式比较法更好。
编辑:
顺便说一句,字符串也会发生类似的情况。所以:
where charfield between 'a' and 'b'将返回以'a‘和“b”开头的所有值。但不是“ba”或“b1”。写它的一种方法是:
where charfield >= 'a' and charfield < 'c'重点是。between是一个完全有效的SQL结构。它对所有数据类型都“正确”工作。然而,对于大多数人来说,SQL的正确之处可能并不直观。明确的比较更接近于避免这个问题。
发布于 2013-12-21 17:39:19
这是对这条评论的回答,“它们是唯一的2种方法吗?还是更多的方法?”下面是一些其他的方法。
where year in (1999, 2000, 2001, 2002, 2003, 2004)
where year > 1998 and year < 2005正如戈登的回答所暗示的那样
where date >= {d '1999-01-01'} and date < {d '2005-01-01'}所有的答案在逻辑上都是等价的。
发布于 2013-12-21 17:25:22
BETWEEN只是为开发者准备的!下面的优化器在识别>=子句时仍然使用BETWEEN和<=。我更喜欢BETWEEN是最好的方法!理由是,它具有很好的可读性。
https://stackoverflow.com/questions/20721466
复制相似问题