一个关于between and的小小的问题

时间:2021-05-05 08:37:51
大家都知道between...and...是包含边界值的,但是我做了一实验,

select * from emp
where ename between 'A' and 'J';

在结果中有首字母为A的ename,但没有J的。这是为什么?

10 个解决方案

#1


因为

idle> select 1 from dual where 'Ja' <= 'J' ;

no rows selected



ename between 'A' and 'J';

等价于

ename >='A' and ename <= 'J' ;

#2


between  是前包后不包吧。 

#3


引用 1 楼  的回复:
因为
Java code

idle> select 1 from dual where 'Ja' <= 'J' ;

no rows selected




ename between 'A' and 'J';

等价于

ename >='A' and ename <= 'J' ;

明白了,真是太感谢你了,分都给你

#4


between...and...本来就只包含前面的值,不包含后来的,LZ你记错了

#5


原因如2楼所言,楼主可以试下这样
select * from emp
where ename between 'A!!!!!!' and 'JZZZZZZ';

#6



CREATE TABLE emp (
  ename VARCHAR2(20)
);

SELECT * FROM EMP  WHERE ENAME BETWEEN 'A' AND 'J';

/**根据上面例子得出的结论:
1、oracle使用字符串直接比较的原理 'ab1''>'aa9999''
  首先比较字符串中的第一个字符的ASCII码值的大小,如果为真,则选中,如果为假,则排除,如果相等,则比较第二位
  比较第二位字符的ASCII码值的大小,如果为真,则选中,如果为假,则排除,如果相等,则依次类推
2、between a and b 框中的范围应该是 包含 a  包含 b 以及a-b之间的

则楼上的例子选中的应该是所有(XXX代表所有字符,....代表任意个):
ename 名字为A, AXXX...  到 IXXX...,以及包含名字为'J''的ename,不包含 JXXX...

下面是测试结果:
**/
INSERT INTO emp VALUES ('A');
INSERT INTO emp VALUES ('Aa');
INSERT INTO emp VALUES ('BSDFSDFDSFDSF');
INSERT INTO emp VALUES ('I999SFSFDSFSDFDSFDSF');
INSERT INTO emp VALUES ('J');
INSERT INTO emp VALUES ('J1');

SELECT * FROM EMP  WHERE ENAME BETWEEN 'A' AND 'J';
/* 查询结果:
1  A
2  Aa
3  BSDFSDFDSFDSF
4  I999SFSFDSFSDFDSFDSF
5  J
就没有插入的J1
*/

#7


引用 4 楼  的回复:
between...and...本来就只包含前面的值,不包含后来的,LZ你记错了


between 是前后均包含.... 只不过包含'J'这个字符而已.

#8


引用 4 楼  的回复:
between...and...本来就只包含前面的值,不包含后来的,LZ你记错了

是你记错了,between and包含边界值,我说的这种情况2楼已经解释清楚了。
因为ja>j,所以才不会显示。

#9


引用 6 楼  的回复:
SQL code

CREATE TABLE emp (
  ename VARCHAR2(20)
);

SELECT * FROM EMP  WHERE ENAME BETWEEN 'A' AND 'J';

/**根据上面例子得出的结论:
1、oracle使用字符串直接比较的原理 'ab1''>'aa9999''
  首先比较字符串中的第一个字符的ASCII码值的大小,如果为真,则选中,……

嘿嘿,谢谢,我已经明白了,已结贴,不能给分了=。=

#10


create table test4(n varchar2(20))
INSERT INTO test4 VALUES ('A');
INSERT INTO test4 VALUES ('Aa');
INSERT INTO test4 VALUES ('BSDFSDFDSFDSF');
INSERT INTO test4 VALUES ('I999SFSFDSFSDFDSFDSF');
INSERT INTO test4 VALUES ('J');
INSERT INTO test4 VALUES ('J2');
SQL> select * from test4 where n like '%A%' or n like '%B%' or n like '%I%' or n like '%J%';

N
--------------------
A
Aa
BSDFSDFDSFDSF
I999SFSFDSFSDFDSFDSF
J
J1
J2

SQL> select * from test4 where n between 'A' and 'J';

N
--------------------
A
Aa
BSDFSDFDSFDSF
I999SFSFDSFSDFDSFDSF
J

得出结论between and  和  or 得出来的结果是不等值的

#1


因为

idle> select 1 from dual where 'Ja' <= 'J' ;

no rows selected



ename between 'A' and 'J';

等价于

ename >='A' and ename <= 'J' ;

#2


between  是前包后不包吧。 

#3


引用 1 楼  的回复:
因为
Java code

idle> select 1 from dual where 'Ja' <= 'J' ;

no rows selected




ename between 'A' and 'J';

等价于

ename >='A' and ename <= 'J' ;

明白了,真是太感谢你了,分都给你

#4


between...and...本来就只包含前面的值,不包含后来的,LZ你记错了

#5


原因如2楼所言,楼主可以试下这样
select * from emp
where ename between 'A!!!!!!' and 'JZZZZZZ';

#6



CREATE TABLE emp (
  ename VARCHAR2(20)
);

SELECT * FROM EMP  WHERE ENAME BETWEEN 'A' AND 'J';

/**根据上面例子得出的结论:
1、oracle使用字符串直接比较的原理 'ab1''>'aa9999''
  首先比较字符串中的第一个字符的ASCII码值的大小,如果为真,则选中,如果为假,则排除,如果相等,则比较第二位
  比较第二位字符的ASCII码值的大小,如果为真,则选中,如果为假,则排除,如果相等,则依次类推
2、between a and b 框中的范围应该是 包含 a  包含 b 以及a-b之间的

则楼上的例子选中的应该是所有(XXX代表所有字符,....代表任意个):
ename 名字为A, AXXX...  到 IXXX...,以及包含名字为'J''的ename,不包含 JXXX...

下面是测试结果:
**/
INSERT INTO emp VALUES ('A');
INSERT INTO emp VALUES ('Aa');
INSERT INTO emp VALUES ('BSDFSDFDSFDSF');
INSERT INTO emp VALUES ('I999SFSFDSFSDFDSFDSF');
INSERT INTO emp VALUES ('J');
INSERT INTO emp VALUES ('J1');

SELECT * FROM EMP  WHERE ENAME BETWEEN 'A' AND 'J';
/* 查询结果:
1  A
2  Aa
3  BSDFSDFDSFDSF
4  I999SFSFDSFSDFDSFDSF
5  J
就没有插入的J1
*/

#7


引用 4 楼  的回复:
between...and...本来就只包含前面的值,不包含后来的,LZ你记错了


between 是前后均包含.... 只不过包含'J'这个字符而已.

#8


引用 4 楼  的回复:
between...and...本来就只包含前面的值,不包含后来的,LZ你记错了

是你记错了,between and包含边界值,我说的这种情况2楼已经解释清楚了。
因为ja>j,所以才不会显示。

#9


引用 6 楼  的回复:
SQL code

CREATE TABLE emp (
  ename VARCHAR2(20)
);

SELECT * FROM EMP  WHERE ENAME BETWEEN 'A' AND 'J';

/**根据上面例子得出的结论:
1、oracle使用字符串直接比较的原理 'ab1''>'aa9999''
  首先比较字符串中的第一个字符的ASCII码值的大小,如果为真,则选中,……

嘿嘿,谢谢,我已经明白了,已结贴,不能给分了=。=

#10


create table test4(n varchar2(20))
INSERT INTO test4 VALUES ('A');
INSERT INTO test4 VALUES ('Aa');
INSERT INTO test4 VALUES ('BSDFSDFDSFDSF');
INSERT INTO test4 VALUES ('I999SFSFDSFSDFDSFDSF');
INSERT INTO test4 VALUES ('J');
INSERT INTO test4 VALUES ('J2');
SQL> select * from test4 where n like '%A%' or n like '%B%' or n like '%I%' or n like '%J%';

N
--------------------
A
Aa
BSDFSDFDSFDSF
I999SFSFDSFSDFDSFDSF
J
J1
J2

SQL> select * from test4 where n between 'A' and 'J';

N
--------------------
A
Aa
BSDFSDFDSFDSF
I999SFSFDSFSDFDSFDSF
J

得出结论between and  和  or 得出来的结果是不等值的