在Oralce中定义了一部分内部函数,通过使用这部分函数可以使用户在进行一些操作的时候更加的方便。
日期函数
日期函数用于处理date类型的数据,默认情况下日期格式为dd-mon-yyyy 即 12-Mon-2004。
sysdate函数 返回系统时间
to_date函数 用来做日期转换
extract(fmt from d) 用于从一个date或者interval类型中截取到特定的部分
add_months(d,n) 返回某一时间d之前或之后n个月的时间
last_day(d) 返回指定日期所在月份的最后一天的日期
sysdate
显示当前的日期,返回date类型数据。
select sysdate from dual;
查看当前的日期
select ename,hiredate from emp where hiredate<(sysdate-8);
查找出已经入职八个月的员工
to_date
to date函数用来做日期转换,主要用于日期格式转换,在Oralce中日期的默认格式为日-月-年,月用英文表示,但有时输入的时候会出现格式不同意,使用该函数可以设置日期的格式来保证存入。
to_date('xxxx-xx-xx','yyyy-mm-dd'))
前面放置的是日期,逗号后面放置的日期格式。yyyy或yy表示年,dd表示天,mm表示月。注:后面年月日的顺序可以随意放置只需要和前面对应即可。
insert into emp (empno,ename,hiredate) values (7935,'FRANK','22-sep-2017');
insert into emp (empno,ename,hiredate) values(7936,'Rose',to_date('2017-09-02','yyyy-mm-dd'));
使用年-月-日的格式想emp表插入新的数据:
extract
extract表示提取date类型数据的部分内容,可提取的内容为年月日。
extract(fmt from d)
d表示的是被提取的部分,fmt表示提取的内容可以为 YEAR,MONTH,DAY。
select extract(year from sysdate) year from dual;
dual表示一个虚表,from前面的year表示别名,sysdate当前日期
select (extract(year from sysdate)-extract(year from hiredate))||'年' KING的工作年限 from emp where ename='KING';
查询emp表中KING的工作年限,假定KIND进入公司后一直在为公司服务
add_months
add_months(d,n) 表示d时间之前或之后n个月的时间,当n为负数表示之前n个月,n为正数表示之后那个月。
select ename,hiredate from emp where sysdate > add_months(hiredate,10*12);
显示满十年服务年限的员工的姓名和受雇日期
last_day
last_day(d) 返回指定日期所在月份的最后一天,若2017.10.29则返回2017.10.31,这个函数主要是用于根据年份和月份返回该月最后一天。
select last_day(to_date('1999-02-01','yyyy-mm-dd')) year from dual;
select last_day(to_date('2000-02-01','yyyy-mm-dd')) year from dual;
select ename,hiredate from emp where hiredate = (last_day(hiredate)-2);
找出各月倒数第三天受雇的所有员工
字符函数
字符函数是指对字符进行操作的函数。
lower(char) 将字符串转化为小写形式
upper(char) 将字符串转化为大写形式
length(char) 返回字符串长度
substr(char,m,n) 取字符串的子串(从1开始计数,m表示从第几个开始,n表示取几个)
replace (char1,serch_string,replace_string) 将一个字符串内的某个字符或字符串全部替换为新的字符或者字符串。
instr(char1,char2,start_position,nth_appearance) 对字符串进行判断,判断其是否含有指定的字符,如果存在则返回该字符串所在的位置。
select lower(ename),sal from emp;
将所有用户的名字按小写方式显示
select upper(ename),sal from emp;
将所有用户的名字按大写方式显示
select ename from emp where length(ename)=5;
显示正好为5字符的员工姓名
select lower(substr(ename,1,3)) from emp;
显示所有员工姓名的前三个字符,并小写显示
select upper(substr(ename,1,1))||lower(substr(ename,2,(length(ename)-1))) 首字母大写 from emp;
以首字母大写的方式显示所有员工的姓名
首字母大写,其余小写思路:
1.取出来首字母大写显示
select upper(substr(ename,1,1)) from emp;
2.取出来后面所有字母小写显示
select lower(substr(ename,2)) from emp;
或者
select lower(substr(ename,2,(length(ename)-1))) from emp;
3.使用连接运算符||连接起来
select upper(substr(ename,1,1))||lower(substr(ename,2,(length(ename)-1))) 首字母大写 from emp;
replace
将一个字符串内的某个字符或字符串全部替换为新的字符或者字符串。
replace (char1,serch_string,replace_string)
char1表示原来的字符,serch_string表示你要搜索的字符,replace_string表示替换为的字符。
select replace('aaaaaaabbbbbbbbbcccccc','a','d') fromn dual;
aaaaaaabbbbbbbbbcccccc为需要替换的函数,把a替换为d
instr
对字符串进行判断,判断其是否含有指定的字符,如果存在则返回该字符串所在的位置。
instr(char1,char2,start_position,nth_appearance)
char1,查找char2字符串,start_position开始位置,nth_appearance查找第几次出现的位置。
select instr('qweAfghAiio','A',1,2) from dual;
查询字母A 第二次出现在了我的字符串啥位置
数学函数
数学函数包括cos、cosh、exp、ln、log、sin、sinh、sqrt、tan、tanh、acos、asin、stan、round、trunc、mod、floor、ceil,但最常用的是round。
round(n,[m]) 该函数用于四舍五入,如果去掉m表示四舍五入到整数,如果m是正数表示四舍五入到小数点后面m位,如果m是负数,表示四舍五入到前面m位
trunc(n,[m]) 该函数用于截取数字,如果省掉m,就截去小数部分,如果m是正数就截取到小数点后m位,如果m是负数就截去到小数点的前m位
mod(m,n) 求余数,mod中如果n是0则返回m的值
floor(n) 返回小于或是等于n的最大整数,如23.46返回23
ceil(n) 返回大于或是等于n的最小整数,如23.46返回24
round和trunc的区别是round是四舍五入,trunc是直接去掉尾部,各有优劣看具体情况使用。
select round(sal,1) from emp where ename='JONES';
将JONES四舍五入,如果四舍五入完之后小数点后面有0则会默认省去
select ename,round(sal,-1) from emp where ename in ('SCOTT','KING','ADAMS','JONES');
select ename,round(sal,1) from emp where ename in ('SCOTT','KING','ADAMS','JONES');
select ename,round(sal) from emp where ename in ('SCOTT','KING','ADAMS','JONES');
上述3个命令都用来获取薪资,只是后面小数不同比较区别即可
Select mod(2,1) from dual;
求2对1的余数
Select mod(2,0) from dual;
mod中如果n是0则返回m的值
select floor(23.46) from dual;
select ceil(23.46) from dual;
select ceil(23) from dual;
select ename,trunc(sal/22) 日薪金 from emp;
显示在一个月30天的情况下所有员工的日薪金,忽略余数
abs(n) 返回数字的绝对值
acos(n) 返回数字的反余弦值
asin(n) 返回数字的反正弦值
atan(n) 返回数字的正切值
cos(n) 返回数字余弦值
exp(n) 返回e的n次幂
log(m,n) 返回对数值
power(m,n) 返回m的n次幂
转换函数
转换函数用于将一种类型转化为另一种类型。常用的转换函数为to_char,将一种类型转换成字符串类型。
to_char('日期','类型');
类型一般包含下面几种
yy 两位数字的年份 2001->04
yyyy 四位数字年份 2004
mm 两位数字的月份 8月->08
dd 两位数字的天数 30号->30
hh24 24进制小时 下午八点->20
hh12 12进制小时 下午八点->08
mi 分钟
ss 秒
9 显示数字,并忽略前面0
0 显示数字,如位数不足,则用0补齐
. 指定位置显示小数点
, 指定位置显示逗号
$ 数字前加美元
L 在数字前加本地货币符号(默认$)
C 在数字前加国际货币符号(默认USD)
G 在指定位置显示组分隔符
D 在指定位置显示小数点符号
select to_date('2017/9/21','yyyy/mm/dd') from dual;
把一个字符串转换成一个日期
select to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') from dual;
把一个日期转换成字符串
select ename,hiredate from emp where to_char(hiredate,'yyyy')=1980;
显示1980年入职员工
select to_char('88882345.45','L999G999G999D99') from dual;
结果 $88,882,345.45
系统函数
系统函数主要是用于查询系统当前的一些信息,其是直接使用一些固定参数来获取当前系统的信息。
syscontext('usernv','固定参数')
//usernv不可更改,sys_context函数最常用的就是userenv命名空间下的系列参数
terminal 当前会话客户所对应的的终端的标识符
lanuage(language) 语言
db_name 当前数据库名称
nls_date_format 当前会话客户所对应的日期格式
session_user 当前会话客户所对应的数据库用户名
current_schema 当前会话客户所对应的默认方案名
host 返回数据库所在主机的名称
单行函数
NVL(x,value) 它的功能是进行内容替换,如果x为null,则NVL函数返回value的值,否则返回x本身的值
NVL2(x,value1,value2) 如果x非空,则返回value1的值,否则返回value2的值
select ename,job,sal,nvl(comm,100) comm from emp where sal<2000;
查询工资是2000元以下的员工的姓名,职位,工资和奖金,如果该人没有奖金则每人发100元
select ename,sal+comm 总收入 from emp;
查询每个人总收入(如果不用这种方法,因为奖金有的为空,所以会报错)
select ename,sal 工资,nvl(comm,0) 奖金 from emp;
查询每个人姓名,工资,奖金
select ename,sal+nvl(comm,0) 总收入 from emp;
查询每个人姓名,总收入
其他例子:
select ename,sysdate-hiredate from emp;
对于每一个员工,显示其加入公司的天数
改进为(去掉小数):select ename,trunc(sysdate-hiredate) from emp;