--1.基本的函数查询
--1.字符串函数
--upper(字符串|列) 返回字符串;将字符串转位大写
select upper('hello') from dual;
select upper(ename) from emp;
--lower(字符串|列) 返回字符串;将字符串转位小写
select lower('HELLO') from dual;
select lower(ename), c.* from emp c;
upper()和lower() 主要用于查询时用户输入的区分大小写的数据;一般会统一转小写或大写;
--initcap(字符串|列) 返回字符串;开头字母大写,其他字母小写;
select initcap(ename) from emp c;
--length(字符串|列) 返回数字;获取指定字符的长度
select length(ename) from emp;
--substr(开始索引[,长度]);进行字符串的截取,如果没有设置长度,表示从开始索引一致截取到结尾;
select substr('helloworld',6) from dual;--下标从1开始 如果设置为0也会按1的方式处理;
select substr('helloworld',0,5) from dual;
select substr('hello world',5,3) from dual;
--截取ename的后三位
select ename,substr(ename,length(ename)-2,3) from emp;--包前不包后
select ename,substr(ename,-3) from emp;---可以设置负数
--replace(字符串|列,新字符串,旧字符串 );替换
--数值函数
--round(列|数字[,小数位]) 返回数字;四舍五入;
--如果没有设置小数点的保留位数,那么会不保留小数直接进位;
--可以设置负数,表示进行整数位进行四舍五入;
select round(788.6)from dual;
select round(726.6,-2) from dual;--700
--trunc(列|数字[,小数位]) 返回数字;数据截取,不进位;
select trunc(769.5641234),trunc(769.5641234,2),trunc(769.5641234,2) from dual;
--mod(列|数字,列|数字)返回数字 求模(求余数)
select mod(10,3) from dual;
---日期函数
--当前时间,oracle提供了一个伪列 sysdate
select sysdate from dual;
--日期操作公式
日期+数字=日期(表示若干天之后的日期)
日期-数字=日期(表示若干天之前的日期)
日期-日期=数字(天数)
select sysdate-7,sysdate+240 from dual;
--对于日期而言,由于每个月的天数是不同的,所以直接进行天数加法实现月数的计算是不准确的;
---查询出每个雇员的编号、姓名、职位、已经被雇用的天数
--如果直接使用天数来实现年或月的计算,那么最终的结果一定是不准确的;
select e.empno,e.ename,e.job,sysdate-e.hiredate
from emp e where e.hiredate is not null;
--为了实现准确的日期操作,oracle 提供了日期函数来处理日期
add_months(列|日期,数字) 返回值:日期 在指定日期上增加若干个月之后的二期
months_between(列|日期,列|日期) 返回值:数字 返回两个日期之间所经历的月数;
last_day(列|日期) 返回值:日期 取得指定日期所在月的最后一天;
next_day(列|日期,星期X) 返回值:日期 返回下一个指定的一周时间数对应的日期
---4个月后的日期
select add_months(sysdate,4) from dual;
--计算所有的雇员到今天为止的雇用月数
select months_between(sysdate,hiredate) from emp;
--当前月份的最后一天日期
select last_day(sysdate) from dual;
---查询出所有员工的编号、姓名、雇用日期、雇用所在月的最后一天
select e.rowid, e.empno,e.ename,e.hiredate,last_day(e.hiredate)
from emp e;
--查询出所有的用过被雇用所在月倒数第三天雇用的雇用信息
select e.* ,e.hiredate, last_day(hiredate)from emp e where hiredate=(last_day(hiredate)-2)
--查询下个星期二的日期
select next_day(sysdate,'星期二') from dual;、
--已年,月,日的方式计算出每个雇员到现在为止的雇用年限
--1.每一位雇员到现在为止雇用的年份;
oracle 提供了两种方式计算年份
a.日期-日期=天数/365 (无法去除润年)
b.Months_between(sysdate,hiredate)/12=年
select trunc(Months_between(sysdate,hiredate)/12) from emp e;
--求出雇佣的月数
select trunc(mod(Months_between(sysdate,hiredate),12)) from emp e
---求出雇佣的天数 日期-日期
---由于时间跨度太长,必须回避年和月的问题
雇用日期+雇用日期到现在日期为止所经历的月数
select trunc(sysdate-add_months(hiredate,Months_between(sysdate,hiredate))) from emp;
---转换函数
to_char(列|日期|数字,转换格式) 返回值:字符串 将日期或数字格式化为指定的字符串;
to_date(列|字符串,转换格式)返回值:日期 按照指定的转换格式编写字符串后将其变为日期型数据
转换格式的标记:
日期:年(yyyy) 月(mm),日(dd)
时间: 时(hh/hh24)分(mi) 秒(ss)
数字:任意数字(9) 货币符号(L)
select to_char(sysdate,'yyyy-mm-dd') from dual;
--利用to_char()实现日期的拆分;
select to_char(sysdate,'yyyy'),to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
---查询在二月份雇用的雇员信息
select * from emp where to_char(hiredate,'mm')='11';
oracle 提供了自动转型的操作,如果不匹配会自动匹配;
select to_char(12345678,'L999,999,999') from dual;
select to_date('2018-11-26','yyyy-mm-dd') from dual;
---通用的函数
--nvl(列) 返回值:数字 ;如果传入的内容是null,则使用默认数值处理,如果不是空则使用原始数值处理
--decode(列|字符串|数值,比较内容1,显示内容1,...[,默认选择内容])
---设置内容会和每个比较内容比较,如果内容相同则使用显示内容,如果不相同则使用默认选择内容显示;
select e.ename,sal+nvl(comm,0)*12
---如果和null做的相关计算后结果为null;
select null+1 from dual;
select e.*, decode(job,'java','JAVA工程师','manager','经理','普通员工')from emp e;