plsql-数据查询(二、条件查询)

本文详细介绍了在Oracle数据库中进行SQL查询时的条件查询,包括逻辑运算、模糊查询、包含查询、范围查询、NULL值判断、ANY和ALL以及布尔连接等七种情况。通过实例演示了如何使用这些条件进行数据筛选,如日期的比较、通配符匹配以及NULL值处理等。

 目录

一、简单查询

二、条件查询

三、排序查询

四、分组查询

五、完整的查询语句


oracle数据库

二、条件查询

二 、条件查询

条件查询的七种情况:

1、逻辑运算

2、模糊查询

3、包含查询

4、范围查询

5、NULL值判断

6、ANY和ALL

7、布尔连接

条件查询语法:

SELECT COL_NAME1,COL_NAME2

  FROM TB_NAME

 WHERE CONDITION ;

语法解释:

从数据源TB_NAME中,按条件CONDITION进行数据筛选,从条件成立的数据中查找COL_NAME1,COL_NAME2,…列的数据。

CONDITION:条件。条件成立,则输出结果,条件不成立,则过滤掉该条数据。

SELECT子句影响列数,WHERE子句影响行数

1、逻辑运算

语法格式:

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME1 = VALUE|COL_NAME2|EXPR;

逻辑运算符:= > < >= <= <> !=

--非相关条件

SELECT * FROM EMP WHERE 1=1; --恒成立

SELECT * FROM EMP WHERE 1=0; --恒不成立

--相关条件:条件与数据源有关系,条件中出现了来自数据源的字段

--非相关条件:条件与数据源没有关系

注意点:

  1. 空值NULL不参与运算比较
  2. 空值NULL做任何比较得到的结果都是不成立

 --NVL(被处理的列,遇空的处理) --将空值处理成指定内容

举例:

SELECT ENAME,SAL,COMM,NVL(COMM,0) FROM EMP;

SELECT ENAME,SAL,COMM,NVL(COMM,0),SAL+NVL(COMM,0) FROM EMP;

(3)区分数值型数据、字符型数据、日期型数据

数值型:单纯的数值上的比较判断

字符型:转换成ASCII码,通过ASCII码的数值来比较判断

日期型:根据日期早晚进行比较判断

--字符型:差一个字母差一个符号都不行,数据严格区分大小写代码不区分

函数拓展:

字符串转日期:TO_DATE('字符串','与字符串对应的日期格式')

日期转字符串:TO_CHAR('日期','日期转成字符串的目标格式')

--日期对比:越早越旧的日期越小,越晚越新的日期越大

举例:

查询入职日期为1980年12月17号的员工信息

SELECT * FROM EMP WHERE HIREDATE = '1980/12/17' ;

 --日期型数据不能直接被书写出来,只能通过其他方式转变出一个日期

SELECT * FROM EMP WHERE HIREDATE = 1980/12/17 ;

TO_DATE(字符型表示的日期,与前边对应的日期格式)

语法:

SELECT '2021-05-13',--含义上表示日期,但类型上不属于日期型

       TO_DATE('2021-05-13','YYYY-MM-DD') --TO_DATE函数:将字符型数据转为日期型数据,但是管不了显示形式

  FROM DUAL;

SELECT * FROM EMP WHERE HIREDATE = TO_DATE('1980/12/17','YYYY/MM/DD') ; --按照日期对比

TO_CHAR():将其他类型的数据转为字符

SELECT HIREDATE,TO_CHAR(HIREDATE,'YYYY-MM-DD') FROM EMP;

SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY-MM-DD') = '1980-12-17';

举例: 

查询1981年劳动节以前入职的员工信息

SELECT * FROM EMP WHERE HIREDATE < TO_DATE('19810501','YYYYMMDD');

SELECT * FROM EMP WHERE TO_CHAR(HIREDATE,'YYYYMMDD') < '19810501';

函数拓展:

大小写转换函数:UPPER()LOWER()

举例:

SELECT * FROM EMP WHERE UPPER(ENAME) = 'SMITH'; --条件中出现的字段,不用非得出现在SELECT子句中

SELECT * FROM EMP WHERE LOWER(ENAME) = 'smith';

--查询未按要求录入大写姓名的员工信息

SELECT * FROM EMP WHERE UPPER(ENAME) <> ENAME ;

SELECT * FROM EMP WHERE LOWER(ENAME) <> ENAME ;

ASCII码与字符转换:ASCII()CHR()

ASC||码值表请自行搜索查询 

2、模糊运算

语法:

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME LIKE '目标格式'; --符合目标格式

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME NOT LIKE '目标格式'; --不符合目标格式

通配符:

_ :有且只有一个字符

% :有零个或者一个或多个字符

拓展:

(1)模糊查询中的转义字符设置:ESCAPE '转义字符'

(注意:只有%和_需要转义)

(2)两个英文单引号表达一个英文单引号的含义

除了% _ ‘ 之外,其他符号直接写即可表达其原本含义

举例:

--查询姓名中含有%的员工信息

SELECT * FROM EMP WHERE ENAME LIKE '%^%%' ESCAPE '^';

--查询姓名中含有两个相邻%的员工信息

SELECT * FROM EMP WHERE ENAME LIKE '%/%/%%' ESCAPE '/';

--查询姓名中含有_的员工信息

SELECT * FROM EMP WHERE ENAME LIKE '%/_%' ESCAPE '/';

--查询姓名中既有%又有_的员工信息

SELECT *

  FROM EMP

 WHERE ENAME LIKE '%/%%/_%' ESCAPE '/'  OR ENAME LIKE '%/_%/%%' ESCAPE '/';

--AND同时满足两个条件  OR只要满足其中一个条件即可

--查询姓名中含有%的员工信息+查询姓名中不含有两个%的员工信息(含有两个%的相反情况)

SELECT * FROM EMP WHERE ENAME LIKE '%/%%' ESCAPE '/';

SELECT * FROM EMP WHERE ENAME NOT LIKE '%/%%/%%' ESCAPE '/';

SELECT * FROM EMP WHERE ENAME LIKE '%/%%' ESCAPE '/' AND ENAME NOT LIKE '%/%%/%%' ESCAPE '/';

--ESCAPE仅作用在它前边相邻的条件上

3.包含查询

语法:

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IN (集合);

--只要在该集合中即条件成立

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME NOT IN (集合);

 --只要不在该集合中即条件成立

集合:一组有着相同属性(相同数据类型)的数据

举例:

--(值1,值2,值3,......) 数据类型相同即可,集合中的第一个值决定了整个集合的数据类型

SELECT * FROM EMP WHERE DEPTNO IN (10,20,'',null);

注意:

(1)集合面向特定的字段

(2)集合中的数据类型要统一

注意:

(1)任何一个字段和空值做任何比较时得到的都是不成立

(2)COL IN (VAL1,VAL2) 等同于 COL = VAL1 OR COL = VAL2

     COL NOT IN (VAL1,VAL2) 等同于 COL <> VAL1 AND COL <> VAL2

(3)结合第1点和第2点:

     IN (集合) 集合中有空值时会被忽略,将符合非空值条件的数据取出

     NOT IN (集合) 集合中有空值时,会导致最终结果中没有数据取出

4.范围查询

语法:

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME BETWEEN NUM1 AND NUM2;

注意点:

1NUM1<=NUM2  -- NUM = NUMBER

2包含边界值

举例:

--查询入职时间在1981年1月1号到1981年12月31号的员工信息

SELECT *

  FROM EMP

 WHERE HIREDATE BETWEEN TO_DATE('19810101', 'YYYYMMDD') AND

       TO_DATE('19811231', 'YYYYMMDD');

5、NULL值判断

语法:

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IS NULL ;

--空值

SELECT COL_LIST FROM TB_NAME WHERE COL_NAME IS NOT NULL ;

 --非空值

举例:

--查找无奖金资格的员工信息

SELECT * FROM EMP WHERE COMM IS NULL;

6、ANY和ALL

ANY --任意一个

ALL --全部所有

= ANY(集合)

> ANY(集合)

< ANY(集合)

= ALL(集合)

> ALL(集合)

< ALL(集合)

举例:

SELECT * FROM EMP WHERE SAL = ANY(800,3000,5000);

SELECT * FROM EMP WHERE SAL > ANY(800,3000,5000); --大于集合中的最小值

SELECT * FROM EMP WHERE SAL < ANY(800,3000,5000); --小于集合中的最大值

SELECT * FROM EMP WHERE SAL = ALL(800,3000,5000);

SELECT * FROM EMP WHERE SAL > ALL(800,3000,5000); --大于集合中的最大值

SELECT * FROM EMP WHERE SAL < ALL(800,3000,5000); --小于集合中的最小值

--集合中的数据不必按照从小到大或从大到小的顺序排列

7、布尔链接

语法:

SELECT COL_NAME FROM TB_NAME WHERE CONDITION1 AND CONDITION2;

SELECT COL_NAME FROM TB_NAME WHERE CONDITION1 OR CONDITION2;

条件连接关键词:AND 和(且)  OR 或

--AND : 两个条件同时满足

--OR  : 两个条件满足任意一个即可

注意:

(1)通过布尔连接,可以合并相同字段的条件,也可合并不同字段的条件

(2)AND和OR一块使用时 AND的优先级高于OR

(3)如果有小括号 先考虑括号中的条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值