条件运算的优先级:
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:显示今天的完整日期,结果参考:“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;--返回第一个不为空的值