一、条件简介

了解条件的一般形式

最普通的条件如下形式:

gyj@OCM> Select * from t1 where name='gyj2';

ID NAME           SALARY

---------- ---------- ----------

2 gyj2             8000

条件只能跟在WHERE之后,用来限制输出的行。通常条件的形式是“列名 比较运算符 值”的形式。上面例子中,比较运算符就是“=”,也就是寻找NAME等于’gyj2’的行。

二、比较运算符

1、运算符形式的比较符号(PPT)

运算符            含义

=                     等于

>                     大于

>=                   大于等于

<=                   小于等于

<> ,!= ,^=    不等于

了解各种比较运算符的意义,这一块比较简单,我就不多说了。

2、非运算符形式的比较符号

了解BETWEEN、IN、LIKE、IS NULL 、EXIST的使用,并了解通配符在LIKE中的使用

(1)列名 [NOT] BETWEEN …… AND …… :在两数之间(并且包括这两个数)

gyj@OCM> select * from t1 where id between 4 and 6;

ID NAME           SALARY

---------- ---------- ----------

4 gyj4            15000

5 gyj5            12000

6 gyj6            12000

显示雇员编号在4和6之间的。在BETWEEN前加上NOT,意义正好相反,表示在两数之外:

gyj@OCM> select * from t1 where id not between 4 and 6;

ID NAME           SALARY

---------- ---------- ----------

2 gyj2             8000

3 gyj3            10000

7 gyj7            12000

1 gyj1            12000

1 gyj1            20000

(2)列名 [NOT] IN (值1,值2,……) : 列值等于值1或等于值2或值3,等等。

gyj@OCM>  select * from t1 where id in (5,6,7);

ID NAME           SALARY

---------- ---------- ----------

5 gyj5            12000

7 gyj7            12000

6 gyj6            12000

显示雇员编号等于5,6,7的,如果我们在IN前面加上NOT,显示的结果是id不等于5或6或7的行。

gyj@OCM>  select * from t1 where id not in (5,6,7);

gyj@OCM> select * from t1 where id not in (5,6,7);

ID NAME           SALARY

---------- ---------- ----------

2 gyj2             8000

3 gyj3            10000

4 gyj4            15000

1 gyj1            12000

1 gyj1            20000

(3)字符型列LIKE ‘字符串’ :字符串匹配运算符。

gyj@OCM> select * from t1 where name like 'gyj2';

ID NAME           SALARY

---------- ---------- ----------

2 gyj2             8000

看它的效果,它有点类似于“=”。但是它的功能比等号强。因为它可以使用如下通配符:

_ : 对应任意的一个字符。

% : 对应任意长度的任意字符。

其中%的任意长度可以是从0到任意长度。而_对应的字符,必需是一个。

gyj@OCM> select * from t1 where name like '_o%';

ID NAME           SALARY

---------- ---------- ----------

9 Joe             22000

10 Tom             28000

‘_o%’的意义是,第一个字符任意,第二个字符是o,第三个字符向后任意字符,且长度任意,可以没有,也就是只有两个字符,如’No’,o后面没有字符了。也可以如示例子中显示的结果Joe,Tom,o后面分别有1个字符。

如果将条件变为:

gyj@OCM> select * from t1 where name like '%o_';

ID NAME           SALARY

---------- ---------- ----------

9 Joe             22000

10 Tom             28000

11 guoyJoe         30000

'%o_',这次是o的后面必须有一个字符,什么字符无所谓。o的前面有什么字符、有没有字符、有多长的字符都无所谓。

有了这两个通配符,LIKE的功能就比等号强多了,比如我想显示所有姓“郭”的人,只要将条件定为:name like ‘郭%’ 即可。如果想显示姓郭的,但整个姓名是两个字的,’郭_’ ,姓名是三个字的’郭__’。等等。

还有一点,在LIKE运算符后的字符串中,%和_不再是普通的字符,而有了特殊的含意。类似的情况我们前面也遇到过,单引号在字符串中也有特殊的含意,表示字符串的开始和结束。如果我想在字符串中使用普通意义的单引号,可以连续输入两个单引号,在字符串中,就表示一个普通意义的字符:单引号。想要在LIKE后的字符串中使用普通意义上的字符%、_ ,也需要额外的处理。比如:'DBA\_%' ESCAPE '\' ,它表示以DBA_开头的任意字符串。ESCAPE指定了一个字符 \ ,因此,在字符串中 \ 后的_ 将不再是特殊字符通配符,而是普通字符_。LIKE加通配符的功能是很强的。但它的查找速度要比普通的等号慢。这很好理解,功能强了后,必然性能要低。因此,在使用时要根据情况选用。不可滥用。

gyj@OCM> select * from t1 where name like 'DBA\_%' ESCAPE '\';

ID NAME           SALARY

---------- ---------- ----------

14 DBA_y             30000

gyj@OCM> select * from t1 where name like 'DBA\%%' ESCAPE '\';

ID NAME           SALARY

---------- ---------- ----------

15 DBA%y             30000

(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;

ASCII('A')

-------------------

97

在ORACLE中,如果你想显示什么内容,可以像上面那样FROM DUAL。

从上面的结果看到,a(小写a)的ASCII码是97。我们可以再试一下,大写A的ASCII码是65。如果现在小写a 与 A排序,升序的话,肯定是大写A在前。

如果字符串长度不相同,该怎么比大小。比如’abc’和’ABCD’,像这样的情况,一般的规则是逐个字符比较,先比第一个字符,如果可以区分出大小,就不再往后比了。也就是说,不论长度。像上面,虽然‘ABCD’有四个字节,但它比’abc’小。因为第一个字符就分出来大小了’a’ 比‘A’大,后面的就不用比了。甚至’a’ 和‘ABCD’比较,也是’a’大而’ABCD’小。但是,’abc’ 和‘abcd’比较,就是’abcd’大了。因为前三个字符一样,分不出大小,因此,这时就看长度了,谁长谁就大。

汉字也一样,字母按照ASCII码,汉字也有编码,如果想看汉字的编号,可以使用如下命令:

gyj@OCM> select dump('郭'),dump('一'),dump('军') from dual;

DUMP('郭')            DUMP('一')            DUMP('军')

--------------------- --------------------- ---------------------

Typ=96 Len=2: 185,249 Typ=96 Len=2: 210,187 Typ=96 Len=2: 190,252

郭: 185,249  一: 210,187  军:190,252

这四个字当中,郭最小。其次是军、一

其实汉字的顺序,基本是按照汉语拼音的顺序比较。

(3)空值:这个是ORACLE中规定好的:升序排序时显示在最后,降序排序时显示在最前面。

3.列别名:

如果列有列名,在排序时可以使用列原来的名字,也可以使用列的别名:

gyj@OCM> select id,name,salary sal from t1 order by salary,id;(SALARY别名为SAL,这时使用列原名)

ID NAME              SAL

---------- ---------- ----------

2 gyj2             8000

3 gyj3            10000

1 gyj1            12000

5 gyj5            12000

6 gyj6            12000

7 gyj7            12000

4 gyj4            15000

gyj@OCM> select id,name,salary sal from t1 order by sal,id; (此处使用列别名)

ID NAME              SAL

---------- ---------- ----------

2 gyj2             8000

3 gyj3            10000

1 gyj1            12000

5 gyj5            12000

6 gyj6            12000

7 gyj7            12000

4 gyj4            15000

gyj@OCM> select id,name,salary sal from t1 order by 3,1;(3和1代表啥知道不?)

ID NAME              SAL

---------- ---------- ----------

2 gyj2             8000

3 gyj3            10000

1 gyj1            12000

5 gyj5            12000

6 gyj6            12000

7 gyj7            12000

4 gyj4            15000

**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********

Name:    guoyJoe

QQ:        252803295

Email:    oracledba_cn@hotmail.com

OCM:    http://education.oracle.com/education/otn/YGuo.HTM

_____________________________________________________________

加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036

oracle or条件后 排序,WHERE条件和排序相关推荐

  1. oracle中where条件后用in这样子查询后变慢

    今日开发一个需求,其中由于需求变态,写了一个挺复杂的sql,在本地测试环境看不出问题,但到了生产就变得非常慢(由于表数据量比较大),把sql粘贴出来执行了一下大概要42秒. 我写的sql大概是这个样子 ...

  2. oracle 聚合函数 条件,Oracle PLSQL之HAVING后面的条件可由聚合函数构成,也可由GROUP BY后的字段构成...

    HAVING主要用于对分组后的数据进行过滤, 一般我们在其后接聚合函数(SUM,COUNT等), 除此之外我们还可以用GROUP BY后面的字段组成HAVING后的过滤条件. SQL> sele ...

  3. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  4. SQL条件查询,分组查询,排序查询,分页查询

    DQL查询操作(条件查询,分组查询,排序查询,分页查询) 文章目录 DQL查询操作(条件查询,分组查询,排序查询,分页查询) 一.查询语法 二.基础查询 三.条件查询 四.排序查询 五.分组查询 六. ...

  5. jq 数组不重复_一道简单的数组遍历题,加上四个条件后感觉无从下手

    题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: ...

  6. 快速排序 python菜鸟教程-NumPy 排序、条件刷选函数

    NumPy 排序.条件刷选函数 NumPy 提供了多种排序的方法. 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性. 下表显示了三种排序算法 ...

  7. mysql 分表 条件查询,面试过关斩将:分库分表-sharding-jdbc分页,排序,条件查询优化...

    之前讲了利用sharding-jdbc 3.1进行分表的情况,也讲了利用一致性hash去做分表的高可用.今天讲下分表后的分页,排序,条件查询优化. 其实本身sharding-jdbc是提供了分页功能的 ...

  8. oracle中的if条件判断语句,SQL条件判断语句语法

    条件判断语句可以作为程序段的逻辑结构跳转,根据不同条件执行不同的程序段,也可以在单条SQL语句内部使用,根据不同条件进行更新选择取值. 三种数据库条件判断语句都有if和case,每种数据库语法存在些微 ...

  9. MYSQL数据库(十)- 数据表的插入(insert)、删(delete)、改(update)、查(select)、group by 分组、having语句设置分组条件,order by查询结果排序,

    目录结构 本章目录 一.插入insert: 方法一:insert标准插入数据写法 方法二:set插入数据写法 方法三:请看本章最后一个案例 二.插入update: 方法一:单表更新记录 方法二:多表更 ...

最新文章

  1. 数据结构与算法(6-1)树的存储(树的双亲表示、树的孩子表示及树的双亲孩子表示)
  2. 开源中国Android客户端v2.6.5代码开源啦!
  3. 物联网:企业需要面临七大风险
  4. React Native ios打包
  5. mysql ssd inodb___细看InnoDB数据落盘 图解 MYSQL
  6. Adb connection Error:远程主机强迫关闭了一个现有的连接
  7. 计算机软件总体上分为,山大2017春季班期末考试 信息系统B
  8. 华润置地php面试题_长春华润置地崑崙御,以至臻匠心,成就城市典范
  9. HarmonyOS Sans - 华为把鸿蒙系统自带的字体开放给全社会免费商用了
  10. 康托尔连续统假设正确吗?
  11. 山西华夏文明历史穿越和黄河文明”研学旅行团
  12. 虚拟服务器配置了打不开,虚拟主机机打不开网站
  13. php根据城市获取天气预报,中国天气网 天气预报API 国家气象局 根据城市名称抓取城市(示例代码)...
  14. 如何用excel做正交分析_如何在SPSS中进行正交设计及正交分析?
  15. 第16集丨阳明心学量子力学
  16. 22222222222222222222222
  17. 怎么用VB对接三方验证码短信接口
  18. GUI界面的初步认识及其开发工具QT
  19. [附源码]Python计算机毕业设计菜鸟驿站快递分发系统
  20. 佳木斯大学计算机专业宿舍,佳木斯大学宿舍条件,宿舍几人间环境好不好(图片)...

热门文章

  1. 产品线的长度宽度深度_LED照明经销商该如何规划自己的产品线
  2. android离散点贝塞尔曲线,离散点拟合曲线贝塞尔曲线B样条.ppt
  3. Linux系统主要目录及作用
  4. 2021毛纲源常考题型解题方法_总结2021年考研数学六大常考题型
  5. pandas.read_csv(path_features_known_csv, header=None)的用法
  6. vmware 报错解决:The system cannot find the path specified.
  7. keras和tensorflow使用 fit_generator 批次训练
  8. LeetCode 804 Unique Morse Code Words--python,java解法
  9. docker 鱼龙混杂之基础操作篇
  10. 同义词词林 java_基于同义词词林扩展版的词语相似度计算