SQL BETWEEN运算符:字符串与数值查询边界取值差异的技术问询
哈哈,这个问题太典型了!很多刚接触SQL的朋友都会在这里踩坑,核心原因就是字符串的字典序比较和数值的大小比较逻辑完全不一样,咱们拆开来说:
一、为什么字符串范围要用'G%'而不是'F%'?
首先得纠正一个小误解:你写的SELECT * FROM movies WHERE name BETWEEN 'D%' AND 'G%'里的%不是模糊匹配的通配符哦!这里是直接做字符串的字典序逐字符比较,%就是一个普通字符(它的ASCII码比所有字母都小)。
那为什么不能用'F%'当上限?举个例子:假设你有个电影叫《Furious 7》,把它和'F%'比的话,第一个字符都是'F',比到第二个字符:'u' vs '%'——因为'%'的ASCII码比字母小,所以'Furious 7' > 'F%'。这时候如果你的BETWEEN上限是'F%',那这部电影就会被排除在外!
而用'G%'的话就不一样了:所有以D、E、F开头的字符串,第一个字符最大就是'F',而'F' < 'G',不管后面跟着什么内容,整个字符串肯定都小于'G%'(因为第一个字符就比'G'小)。这样BETWEEN 'D%' AND 'G%'就能精准包含所有以D、E、F开头的电影了。
哦对了,其实更严谨的写法是用name >= 'D' AND name < 'G',不用带%,逻辑更清晰,效果完全一致~
二、为什么年份范围用1979而不是1980?
这个就简单多了,因为年份是整数数值,咱们要的70年代就是1970、1971...一直到1979这10个整数。BETWEEN 1970 AND 1979是闭区间,会包含1970和1979这两个端点,刚好覆盖所有70年代的年份。
如果换成上限1980的话,BETWEEN 1970 AND 1980就会把1980年的电影也包含进去,那可是80年代的开头了,完全不符合咱们的需求呀!
最后总结一下核心差异:
- 字符串比较是按字典序逐位对比,要包含所有以F开头的内容,上限得选第一个比F大的字符开头的字符串(比如G开头的)
- 数值比较是直接按大小判断,要包含到1979,就直接写1979当上限就行
内容的提问来源于stack exchange,提问作者floppet

