关于mysql:SQL BETWEEN用于文本和数字值

SQL BETWEEN for text vs numeric values

BETWEEN子句中使用BETWEEN来选择两个值之间的数据范围。
如果我是正确的,则是否排除了范围的端点是特定于DBMS的。
我在以下内容中无法理解的内容:
如果我有一个值表,请执行以下查询:

1
2
3
SELECT food_name
    FROM health_foods
    WHERE calories BETWEEN 33 AND 135;`

该查询作为结果行返回,包括卡路里= 33和卡路里= 135(即包括范围端点)。

但是,如果我这样做:

1
2
3
SELECT food_name
    FROM health_foods
    WHERE food_name BETWEEN 'G' AND 'O';

我没有以O开头的food_name行。即 范围的末尾不包括在内。
为了使查询按预期工作,我输入:

1
2
3
SELECT food_name
    FROM health_foods
    WHERE food_name BETWEEN 'G' AND 'P';`

我的问题是为什么数字和文本数据的BETWEEN有如此大的区别?


Between和数字和字符串的操作方式完全相同。包括两个端点。这是ANSI标准的一部分,因此这是所有SQL方言的工作方式。

表达方式:

1
where num between 33 and 135

当num为135时将匹配。当number为135.00001时将不匹配。

同样,表达式:

1
where food_name BETWEEN 'G' AND 'O'

将匹配" O",但不匹配以" O"开头的任何其他字符串。

一旦简单的合并就是使用"?"。它具有最大的7位ASCII值,因此对于英语应用程序,通常可以很好地工作:

1
where food_name between 'G' and 'O~'

您还可以做其他各种事情。这里有两个想法:

1
2
where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'

不过,重要的一点是between的工作方式相同,而与数据类型无关。


以"橙色"与" O"为例。字符串" Orange"显然不等于字符串" O",并且随着它的变长,它必须大于或小于。

您可以执行'Orange'<'OZZZZZZZZZZZZZZZZ'。


尝试使用REGEX

1
  WHERE  food_name REGEXP '^[G-O]';

这会给您以G开头的所有food_name,直到以O开头的所有

此处演示