BETWEEN
在使用WHERE
子句选择两个值之间的范围的数据。
如果我是正确的范围内的端点是否被排除与否是DBMS具体。
我不能在以下理解:
如果我有值的表,我做了以下查询:
SELECT food_name
FROM health_foods
WHERE calories BETWEEN 33 AND 135;`
查询返回结果作为行包括卡路里= 33和卡路里=( 包括即范围端点)135。
但是,如果我这样做:
SELECT food_name
FROM health_foods
WHERE food_name BETWEEN 'G' AND 'O';
我不获取行food_name
开始O
。 即该范围的端部除外 。
对于查询按预期工作,我键入:
SELECT food_name
FROM health_foods
WHERE food_name BETWEEN 'G' AND 'P';`
我的问题是,为什么会出现这样的差异BETWEEN
数字和文本数据?
之间运行的确切数字和字符串一样。 两个端点都包括在内。 这是ANSI标准的一部分,所以它是所有SQL方言是如何工作的。
表达方式:
where num between 33 and 135
当num是135时数为135.00001它不会匹配将匹配。
类似地,表达式:
where food_name BETWEEN 'G' AND 'O'
将匹配“O”,而不是其他任何字符串开头与“O”。
一旦简单的组装机是用“〜”。 这样做的最大的7位ASCII值,所以对英语语言应用程序,它通常工作得很好:
where food_name between 'G' and 'O~'
你也可以做各种其他事情。 这里有两个想法:
where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'
最重要的一点,虽然是between
不管数据类型的方式是相同的。
采取“橙”与“O”的例子。 字符串“橙”显然不等于字符串“O”,并且因为它是更长的时间,它必须是更大的,不小于。
你可以做“橙” <“OZZZZZZZZZZZZZZ”虽然。
试试这个用REGEX
WHERE food_name REGEXP '^[G-O]';
这给你所有food_name至极开始由G直到那些谁被O开始
DEMO这里