05oracle之条件运算的优先级、函数的分类

条件运算的优先级:

where条件子句的解析顺序:从右到左

  • 知识点
  • SQL优化:(where条件特别多的情况下,就有效果了)
  • 对于and,应该尽量把假的放到右边。
  • 对于or,应该尽量把真的放到右边。

针对mysql,其条件执行顺序是 从左往右,自上而下
针对orcale,其条件执行顺序是从右往左,自下而上

函数的分类:

Oracle的内置函数分为单行函数和多行函数(多行函数还称之为组函数、聚集函数等)。

  • 单行函数:
  • 操作数据对象,接受参数返回一个结果
  • 只对一行进行变换
  • 每行返回一个结果
  • 可以转换数据类型
  • 可以嵌套
  • 参数可以是一个或者一列
  • 单行函数包括:
  • 字符
  • 通用
  • 数值
  • 日期
  • 转换

字符函数:

  • 大小写控制函数

示例:

--需求1:查询出KING的这个员工的信息。
select * from emp where ename ='king';
-- 会将name字段的值转换成小写
select lower(name) from emp;
-- 会将name字段的值转换成大写
select upper(name) from emp;
-- 转成大写
select upper('king') from dual;
--首字母大写
select initcap('yanQi  ai  xue xi') from dual;-- Yanqi  Ai  Xue Xi

因此,一般情况下,建议将转换函数放到固定值上面(好处之一就是只需要转换一次,还有一个好处,就是你不知道用户到底输入的是大写还是小写还是混合写,更适应业务)。

  • 字符控制函数

在这里插入图片描述
示例:

--需求1:替换字符串'abcd'中的’bc’为’ITCAST’,最终显示为’aITCASTd’
SELECT REPLACE ('abcd','bc','ITCAST') FROM dual;
--需求2:去掉' Hello World '前后的空格
SELECT TRIM(' Hello World ') FROM dual;
--需求3:去掉'Hello WorldH'前后的H字符(提示:使用from关键字)
SELECT TRIM('H' FROM 'Hello WorldH') FROM dual;
  • 数字函数:
    在这里插入图片描述

示例:

--需求:钱数:1385.56,分别根据不同场景进行处理显示不同结果:买东西(抹零头:1385,1380)、
发工资(发钱了:1386)  trunc.后面是正的,前面是负数
-- trunc 截断
-- round 四舍五入
select  trunc(1385.56) 买东西抹零头 from dual;-- 1385

select trunc(1385.56,-1)  买东西抹零头 from dual;-- 1380 
select trunc(1385.56,-2)  买东西抹零头 from dual;-- 1300

select trunc(1385.56, 1)  买东西抹零头 from dual;-- 1385.5
select trunc(1385.56, 2)  买东西抹零头 from dual;-- 1385.56

Round和trunc函数,除了对数字起作用外,对于日期也是起作用的。

  • 日期函数:

其中:

 日期可以相减么?日期可以相加么?
 SELECT SYSDATE-SYSDATE FROM dual;--日期相减一般是为了计算两个日期之间间隔
 SELECT SYSDATE+SYSDATE FROM dual;--日期相加没意义

常用的函数有:
在这里插入图片描述
next_day(基础日期,星期几)
星期几,是从周日开始,分别数字为1,2,3。。。。

示例:

--需求1:计算员工的工龄(工龄:当前的日期和入职的日期的差),要求分别显示员工入职的天数、多少月
、多少年。
select  ename ,
       trunc(sysdate - hiredate) 多少天,
       trunc(months_between(sysdate,hiredate)) 工龄月精准,
       trunc(months_between(sysdate,hiredate) / 12 ) 工龄年
 from emp; 
--需求2:查看当月最后一天的日期。
SELECT last_day(SYSDATE) FROM dual;
--需求3:查看指定日期的下一个星期天或星期一的日期。(next_day(基础日期,星期几))
--星期日是1,星期一2
SELECT next_day(SYSDATE,1) FROM dual;
SELECT next_day(SYSDATE,2) FROM dual;

扩展:时间戳systimestamp关键字。

SELECT SYSDATE,Systimestamp FROM dual;

在这里插入图片描述

  • 转换函数:
  • 隐性和显性

隐式转换:

--需求:查询10号部门的信息,分别使用数字和字符串作为条件的值。
SELECT * FROM emp WHERE deptno=10;
SELECT * FROM emp WHERE deptno='10';--字符串隐式转换为数字了
SELECT * FROM emp WHERE deptno='10q';--隐式转换的前提,是能转换才可以。

条件:Oracle可以自动的完成下列类型(三种)的转换
在这里插入图片描述
显示转换(三个函数):

  1. 将日期或数字 ==> 字符
    在这里插入图片描述
  2. 将字符 ==>日期
    在这里插入图片描述
  3. 将字符 ==>数字
    在这里插入图片描述

【提示:记忆方式】:第一个参数都是要转换的目标(到底用哪个函数,跟目标有关系),第二个都是转换的格式。

示例:

--需求1:显示今天的完整日期,结果参考:“2019-07-06 11:07:25”。
SELECT to_char(SYSDATE,'yyyy-MM-dd HH:mi:ss') FROM dual;--java的日期格式,和sql的不一样
SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;--sql--24小时制
SELECT to_char(SYSDATE,'yyyy-mm-dd hh:mi:ss') FROM dual;--sql--12小时制
SELECT to_char(SYSDATE,'yyYy-Mm-Dd hH24:mi:ss') FROM dual;--格式不区分大小写
--需求2:显示今天是几号,不包含年月和时间。
SELECT to_char(SYSDATE,'dd')||'日' FROM dual;--字符串拼接方式
SELECT to_char(SYSDATE,'dd"日"') FROM dual;--格式中直接加入固定值
--需求3:显示当月最后一天是几号
SELECT to_char(last_day(SYSDATE),'dd') FROM dual;
--需求4:xiaoming的入职日期是2019-03-15,由于其入职日期当时忘记录入,现在请将其插入到emp表中。
UPDATE emp SET hiredate =to_date('2019-03-15','yyyy-mm-dd') WHERE ename ='xiao_ming';
COMMIT;
--需求5:查看2019年2月份最后一天是几号.
SELECT last_day(to_date('201902','yyyymm')) FROM dual;
SELECT to_char(last_day(to_date('201902','yyyymm')),'dd') FROM dual;
SELECT to_date('201902','yyyymm') FROM dual;--日期的默认值,不指定日期,默认1

【注意】和java不同,Oracle的日期格式对大小写不敏感。

日期格式的常见元素:
在这里插入图片描述

需求:查看显示今天是星期几
SELECT to_char(SYSDATE,'day') FROM dual;

数字格式的常见元素:
在这里插入图片描述
提示:9代表任意数字,可以不存在。0代表数字,如果该位置不存在,则用0占位。

需求:查询员工的薪水,格式要求:两位小数,千位数分割,本地货币代码。
--需求:查询员工的薪水,格式要求:两位小数,千位数分割,本地货币代码。
SELECT ename,sal,to_char(sal,'L99,999.00') FROM emp;
SELECT ename,sal,to_char(sal,'L00,000.00') FROM emp;
  • 滤空函数(通用函数):

滤空函数也称为通用函数,其特点是:适用于任何数据类型,同时也适用于空值。
常见的滤空函数及其用法:

  • nvl(a,c),当a为null的时候,返回c,否则,返回a本身。
  • nvl2(a,b,c),当a为null的时候,返回c,否则返回b
  • 其中,nvl2中的2是增强的意思,类似于varchar2。
  • nullif(a,b),当a=b的时候,返回null,否则返回a
  • coalesce(a,b,c,d),从左往右查找,当找到第一个不为null的值的时候,就显示这第一个有值的值。

示例:

--需求:查询员工的月收入(基本薪资+奖金)
SELECT ename,sal+nvl(comm,0) 月收入 FROM emp;
SELECT ename ,NVL2(sal,sal,0)+nvl(comm,0) FROM emp;--为了小明
SELECT coalesce(NULL,NULL,1,2) FROM dual;--返回第一个不为空的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值