Oracle WHERE条件和排序(二)

2014-11-24 09:21:32 · 作者: · 浏览: 3
000
(4)IS NULL 和 IS NOT NULL
我们以前曾讲到过,NULL就是未知,不知道。任何数据和未知运算,结果还是未知。就像一个不知道是几的数加1,结果还是不知道是几。同样,如果不知道和1作比较,无论比较操作是大于、等于还是小于等等,结果也是不知道。如果有人问你,产知道是几的数是否等于1,你的答案是什么!肯定还是不知道。看下面的测试,我如下显示薪水等于NULL的行,也就是显示薪水等于不知道是几的行:
gyj@OCM> select * from t1 where salary=NULL;
no rows selected
结果当然还是不知道。在表中是有薪水为NULL的行,但是普通的等于,是没办法针对NULL值。必须要使用IS NULL才行:
select * from t1 where salary is NULL;
gyj@OCM> select * from t1 where salary is NULL;
ID NAME SALARY
---------- ---------- ----------
8 gyj8
这次有了结果。gyj8的薪水为空。如果要显示薪水非空的,是使用IS NOT NULL:
gyj@OCM> select * from t1 where salary is not NULL;
ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
4 gyj4 15000
3、逻辑运算符
讲述AND、OR、NOT的使用,和BETWEEN …… and ……,IN的比较
逻辑运算符的作用是将多个条件连接起来。比如我想显示年龄大于20,小于30行。AGE>20是一个条件,AGE<30又是一个条件,如果想将两个条件组合起来,就要使用逻辑运算符了,以如下三种逻辑运算符:
条件1 AND 条件2 : AND就是“且”的意思。条件1满足,且 条件2也要满足。条件1、2必须都满足。
条件1 OR 条件2 :OR是“或”的意思。条件1满足,或 条件2满足。也就是条件1、2中有一个满足就行。
NOT 条件 :将条件的结果反转。NOT,就是不、非的意思。如果条件本来满足,NOT 满足就变成了不满足。
条件在计算机中,返回的结果是真假。如果条件满足,结果就是真,如果条件不满足,结果就假。而逻辑运算符,就是专门针对对真假进行运算的。
(1)AND运算的结果表:
条件1 条件2 结果
条件1 AND 条件2 真 真 真
真 假 假
假 真 假
假 假 假
也就是只要条件1或条件2有一个不为真,整个表达式结果就是假。
(2)OR运算的结果表:
条件1 条件2 结果
条件1 OR 条件2 真 真 真
真 假 真
假 真 真
假 假 假
也就是只要条件1或条件2有一个为真,整个表达式结果就是真。
(3)NOT运算的结果:
条件1 结果
NOT 条件1 真 假
假 真
NOT是非的意思。如果条件为真,NOT 真,也就是非真,结果当然就是假了。
下面我们分别试验下:
gyj@OCM> select * from t1 where not id<2;
ID NAME SALARY
---------- ---------- ----------
2 gyj2 8000
3 gyj3 10000
4 gyj4 15000
id<2 本来表示id号小于2,加上NOT后,变成了id号不小于2,也就是大于等于2了。显示的结果中,雇员编号为2、3、4的都显示出来了。小于2的没有显示出来。
再试一个AND,显示id号大于等于5,小于等于6行:
gyj@OCM> Select * from t1 where id>=4 and id<=7;
ID NAME SALARY
---------- ---------- ----------
4 gyj4 15000
5 gyj5 12000
7 gyj7 12000
6 gyj6 12000
再试一个OR,显示NAME等于Joe或等于Tom:
gyj@OCM> select * from t1 where name='Joe' or name='Tom';
ID NAME SALARY
---------- ---------- ----------
9 Joe 22000
10 Tom 28000
其实,利用逻辑运算符,也可以实现 BETWEEN …… AND 和IN()同样的功能。where id>=4 and id<=7这个AND的运算,就可以转化为age BETWEEN 4 and 7。但注意,id>4 and id<7 ,则应该是age BETWEEN 5 and 6。比较起来,AND和IN更灵活,功能更强。
三、各种运算符的优先级:
讲述运算任的优先顺序
优先顺序 运算符类型
1 算术运算
2 字符串连接 ||
3 比较操作
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT 逻辑条件
7 AND 逻辑条件
8 OR 逻辑条件
根据上面的优先顺序,如果我有如下条件:
SALARY+100>10000 : ORACLE将先计算SALARY+100,然后,再用结果和10000比较。因为算术运算符的优先排名是1,比较操作的优先排名是3。再看如下的例子:SALARY+100>10000 AND SALARY+1>30 (可以分解成:=> N>10000 AND M>30 => X AND Y)
我们也可以使用()来改变优先顺序。()中的表达式,将是最先被计算的。
四、排序 :
讲述ORDER BY的使用,注意字符顺序
1、排序命令的形式:
ORDER BY 列名1 [ ASC | DESC ],列名2 [ ASC | DESC ],…………
ORDER BY通常要放在整条语句的最后,WHERE条件的后面。ASC是升序,DESC是降序。如果省略ASC、DESC将按升序排列,也就是说,默认顺序是升序。我们先看个例子:
select * from t1 order by salary; :按薪水从小到大排序。再看如下例子:
select * from t1 order by salry,id; :这样的排序列有两列的,先按SALARY列的升序排,如果SALARY中有重复的值,这些重复的值按ID的大小排。这就是多列排序。前面的列重复了,按后面的列排。再看下面的:
select * from t1 order by salry desc,id; :它表示先按SALARY的降序排,也就是由大到小。如果SALARY中有重复的值,重复值按ID的升序排。
2、数据顺序
(1)数字型:数字型当然简单了,2肯定比1大,如果是升序,1要排在2之前。
(2)字符型:字符型是按照字母的ASCII码进行排序的。我们可以如下显示一个字母的ASCII码:
SQL> select ascii('a') from dual;
ASCI