select * from emp
where ename between 'A' and 'J';
在结果中有首字母为A的ename,但没有J的。这是为什么?
10 个解决方案
#1
因为
而
ename between 'A' and 'J';
等价于
ename >='A' and ename <= 'J' ;
idle> select 1 from dual where 'Ja' <= 'J' ;
no rows selected
而
ename between 'A' and 'J';
等价于
ename >='A' and ename <= 'J' ;
#2
between 是前包后不包吧。
#3
明白了,真是太感谢你了,分都给你
#4
between...and...本来就只包含前面的值,不包含后来的,LZ你记错了
#5
原因如2楼所言,楼主可以试下这样
select * from emp
where ename between 'A!!!!!!' and 'JZZZZZZ';
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
between 是前后均包含.... 只不过包含'J'这个字符而已.
#8
是你记错了,between and包含边界值,我说的这种情况2楼已经解释清楚了。
因为ja>j,所以才不会显示。
#9
嘿嘿,谢谢,我已经明白了,已结贴,不能给分了=。=
#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 得出来的结果是不等值的
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
因为
而
ename between 'A' and 'J';
等价于
ename >='A' and ename <= 'J' ;
idle> select 1 from dual where 'Ja' <= 'J' ;
no rows selected
而
ename between 'A' and 'J';
等价于
ename >='A' and ename <= 'J' ;
#2
between 是前包后不包吧。
#3
明白了,真是太感谢你了,分都给你
#4
between...and...本来就只包含前面的值,不包含后来的,LZ你记错了
#5
原因如2楼所言,楼主可以试下这样
select * from emp
where ename between 'A!!!!!!' and 'JZZZZZZ';
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
between 是前后均包含.... 只不过包含'J'这个字符而已.
#8
是你记错了,between and包含边界值,我说的这种情况2楼已经解释清楚了。
因为ja>j,所以才不会显示。
#9
嘿嘿,谢谢,我已经明白了,已结贴,不能给分了=。=
#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 得出来的结果是不等值的
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 得出来的结果是不等值的