SQL BETWEEN用于文本与数值

Cra*_*lus 13 mysql sql varchar numbers between

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

SELECT food_name 
    FROM health_foods 
    WHERE calories BETWEEN 33 AND 135;`  
Run Code Online (Sandbox Code Playgroud)

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

但如果我这样做:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'O';
Run Code Online (Sandbox Code Playgroud)

没有food_name开头的行O.即排除范围的结束.
为了使查询按预期工作,我键入:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'P';`   
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么BETWEEN数字和文本数据会有这样的差异?

Gor*_*off 20

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

表达方式:

where num between 33 and 135
Run Code Online (Sandbox Code Playgroud)

当num为135时匹配.当数字为135.00001时,它将不匹配.

同样,表达式:

where food_name BETWEEN 'G' AND 'O'
Run Code Online (Sandbox Code Playgroud)

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

一旦简单的kludge使用"〜".它具有最大的7位ASCII值,因此对于英语应用程序,它通常运行良好:

where food_name between 'G' and 'O~'
Run Code Online (Sandbox Code Playgroud)

你也可以做其他各种事情.这有两个想法:

where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'
Run Code Online (Sandbox Code Playgroud)

但重要的是,between无论数据类型如何,都以相同的方式工作.


Ste*_*veP 5

以"橙色"与"O"为例.字符串'Orange'显然不等于字符串'O',并且因为它更长,它必须更大,不能小于.

你可以做'Orange'<'OZZZZZZZZZZZZZZ'.

  • @Cratylus认为它是小数位,BETWEEN 33和135将返回135而不是135.5 (4认同)