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; --恒不成立
--相关条件:条件与数据源有关系,条件中出现了来自数据源的字段
--非相关条件:条件与数据源没有关系
注意点:
- 空值NULL不参与运算比较
- 空值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;
注意点:
(1)NUM1<=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)如果有小括号 先考虑括号中的条件
本文详细介绍了在Oracle数据库中进行SQL查询时的条件查询,包括逻辑运算、模糊查询、包含查询、范围查询、NULL值判断、ANY和ALL以及布尔连接等七种情况。通过实例演示了如何使用这些条件进行数据筛选,如日期的比较、通配符匹配以及NULL值处理等。
1242

被折叠的 条评论
为什么被折叠?



