在SQL语句中需要选择两个值之间的数据范围时,通常我们会想到BETWEEN ... AND操作符,例如,

SELECT * FROM TABLE WHERE A BETWEEN B AND C;

SELECT * FROM TABLE WHERE A BETWEEN B AND C;

请问A和B、C这两个边界值的关系是什么?A>B?A>=B?A<C?A<=C?

不同的数据库,对BETWEEN ... AND操作符的处理,可能存在差异的。有些数据库返回A>B & A<C,有的数据库返回A>=B & A<=C,有的数据库返回A>=B & A<C。

我们看下Oracle中,是如何操作BETWEEN ... AND的。

官方手册上,BETWEEN ... AND定义如下,

expr1 [ NOT ] BETWEEN expr2 AND expr3

expr1 [ NOT ] BETWEEN expr2 AND expr3

其中expr可以是数字、字符、或者日期表达式。如果expr不是相同的类型,则Oracle可能会使用隐式转换。如果是在SQL中,expr1可能会使用多次,如果是在PL/SQL中,expr1只会使用1次。如果expr3<exprr2,间隔是空的。如果expr1是NULL,结果就是NULL。

这两种表达,是等价的,

expr1 NOT BETWEEN expr2 AND expr3
NOT (expr1 BETWEEN expr2 AND expr3)

expr1 NOT BETWEEN expr2 AND expr3
NOT (expr1 BETWEEN expr2 AND expr3)

这两种表达,是等价的,expr2 less than or equal to expr1 AND expr1 less than or equal to expr3,其实他就回答了,开头的问题,在Oracle中,A BETWEEN B AND C,表示的是A>=B & A<=C,

expr1 BETWEEN expr2 AND expr3
expr2 <= expr1 AND expr1 <= expr3

expr1 BETWEEN expr2 AND expr3
expr2 <= expr1 AND expr1 <= expr3

我们再从实验,论证一下,

SQL> create table a(id number);
Table created.

SQL> insert into a values(1);
1 row created.

SQL> insert into a values(2);
1 row created.

SQL> insert into a values(3);
1 row created.

SQL> select * from a;
        ID
----------
         1
         2
         3

SQL> select * from a where id between 1 and 3;
        ID
----------
         1
         2
         3

SQL> select * from a where x between 'a' and 'c';
        ID X
---------- -
         1 a
         2 b
         3 c

SQL> create table a(id number);
Table created.

SQL> insert into a values(1);
1 row created.

SQL> insert into a values(2);
1 row created.

SQL> insert into a values(3);
1 row created.

SQL> select * from a;
        ID
----------
         1
         2
         3

SQL> select * from a where id between 1 and 3;
        ID
----------
         1
         2
         3

SQL> select * from a where x between 'a' and 'c';
        ID X
---------- -
         1 a
         2 b
         3 c

可以看到,无论是数字,还是使用字符,A BETWEEN B AND C,都等价的是A>=B & A<=C。

若朋友们使用其他的数据库,可以留言告诉我们在不同的数据库中,BETWEEN ... AND都出现怎样不同的现象?

参考:

https://www.w3school.com.cn/sql/sql_between.asp

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: oracle