在Oralce中定義了一部分內(nèi)部函數(shù)疼进,通過使用這部分函數(shù)可以使用戶在進(jìn)行一些操作的時(shí)候更加的方便。
日期函數(shù)
日期函數(shù)用于處理date類型的數(shù)據(jù)信殊,默認(rèn)情況下日期格式為dd-mon-yyyy 即 12-Mon-2004炬称。
sysdate函數(shù) ? ?返回系統(tǒng)時(shí)間
to_date函數(shù) ? ? 用來做日期轉(zhuǎn)換
extract(fmt from d) 用于從一個(gè)date或者interval類型中截取到特定的部分
add_months(d,n) 返回某一時(shí)間d之前或之后n個(gè)月的時(shí)間
last_day(d) 返回指定日期所在月份的最后一天的日期
sysdate
顯示當(dāng)前的日期,返回date類型數(shù)據(jù)涡拘。
select sysdate from dual;
查看當(dāng)前的日期
select ename,hiredate from emp where hiredate<(sysdate-8);
查找出已經(jīng)入職八個(gè)月的員工
to_date
to date函數(shù)用來做日期轉(zhuǎn)換玲躯,主要用于日期格式轉(zhuǎn)換,在Oralce中日期的默認(rèn)格式為日-月-年鳄乏,月用英文表示跷车,但有時(shí)輸入的時(shí)候會出現(xiàn)格式不同意,使用該函數(shù)可以設(shè)置日期的格式來保證存入橱野。
to_date('xxxx-xx-xx','yyyy-mm-dd'))
前面放置的是日期朽缴,逗號后面放置的日期格式。yyyy或yy表示年水援,dd表示天密强,mm表示月茅郎。注:后面年月日的順序可以隨意放置只需要和前面對應(yīng)即可。
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表插入新的數(shù)據(jù):
extract
extract表示提取date類型數(shù)據(jù)的部分內(nèi)容或渤,可提取的內(nèi)容為年月日系冗。
extract(fmt from d)
d表示的是被提取的部分,fmt表示提取的內(nèi)容可以為 YEAR,MONTH,DAY薪鹦。
select extract(year from sysdate) year from dual;
dual表示一個(gè)虛表掌敬,from前面的year表示別名,sysdate當(dāng)前日期
select (extract(year from sysdate)-extract(year from hiredate))||'年' KING的工作年限 from emp where ename='KING';
查詢emp表中KING的工作年限池磁,假定KIND進(jìn)入公司后一直在為公司服務(wù)
add_months
add_months(d,n) 表示d時(shí)間之前或之后n個(gè)月的時(shí)間涝开,當(dāng)n為負(fù)數(shù)表示之前n個(gè)月,n為正數(shù)表示之后那個(gè)月框仔。
select ename,hiredate from emp where sysdate > add_months(hiredate,10*12);
顯示滿十年服務(wù)年限的員工的姓名和受雇日期
last_day
last_day(d) 返回指定日期所在月份的最后一天舀武,若2017.10.29則返回2017.10.31,這個(gè)函數(shù)主要是用于根據(jù)年份和月份返回該月最后一天离斩。
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);
找出各月倒數(shù)第三天受雇的所有員工
字符函數(shù)
字符函數(shù)是指對字符進(jìn)行操作的函數(shù)银舱。
lower(char) ? ? ? ? 將字符串轉(zhuǎn)化為小寫形式
upper(char) ? ? ? ?將字符串轉(zhuǎn)化為大寫形式
length(char) ? ? ? ?返回字符串長度
substr(char,m,n) 取字符串的子串(從1開始計(jì)數(shù),m表示從第幾個(gè)開始跛梗,n表示取幾個(gè))
replace (char1,serch_string,replace_string) 將一個(gè)字符串內(nèi)的某個(gè)字符或字符串全部替換為新的字符或者字符串寻馏。
instr(char1,char2,start_position,nth_appearance) 對字符串進(jìn)行判斷,判斷其是否含有指定的字符核偿,如果存在則返回該字符串所在的位置诚欠。
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;
顯示所有員工姓名的前三個(gè)字符,并小寫顯示
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.使用連接運(yùn)算符||連接起來
select upper(substr(ename,1,1))||lower(substr(ename,2,(length(ename)-1))) 首字母大寫 from emp;
replace
將一個(gè)字符串內(nèi)的某個(gè)字符或字符串全部替換為新的字符或者字符串轰绵。
replace (char1,serch_string,replace_string)
char1表示原來的字符,serch_string表示你要搜索的字符尼荆,replace_string表示替換為的字符左腔。
select replace('aaaaaaabbbbbbbbbcccccc','a','d') fromn dual;
aaaaaaabbbbbbbbbcccccc為需要替換的函數(shù),把a(bǔ)替換為d
instr
對字符串進(jìn)行判斷捅儒,判斷其是否含有指定的字符液样,如果存在則返回該字符串所在的位置。
instr(char1,char2,start_position,nth_appearance)
char1巧还,查找char2字符串鞭莽,start_position開始位置,nth_appearance查找第幾次出現(xiàn)的位置麸祷。
select instr('qweAfghAiio','A',1,2) from dual;
查詢字母A 第二次出現(xiàn)在了我的字符串啥位置
數(shù)學(xué)函數(shù)
數(shù)學(xué)函數(shù)包括cos澎怒、cosh、exp摇锋、ln丹拯、log站超、sin、sinh乖酬、sqrt死相、tan、tanh咬像、acos算撮、asin、stan县昂、round肮柜、trunc、mod倒彰、floor审洞、ceil,但最常用的是round待讳。
round(n,[m]) 該函數(shù)用于四舍五入芒澜,如果去掉m表示四舍五入到整數(shù),如果m是正數(shù)表示四舍五入到小數(shù)點(diǎn)后面m位创淡,如果m是負(fù)數(shù)痴晦,表示四舍五入到前面m位
trunc(n,[m]) 該函數(shù)用于截取數(shù)字,如果省掉m琳彩,就截去小數(shù)部分誊酌,如果m是正數(shù)就截取到小數(shù)點(diǎn)后m位,如果m是負(fù)數(shù)就截去到小數(shù)點(diǎn)的前m位
mod(m,n) 求余數(shù)露乏,mod中如果n是0則返回m的值
floor(n) 返回小于或是等于n的最大整數(shù)碧浊,如23.46返回23
ceil(n) 返回大于或是等于n的最小整數(shù),如23.46返回24
round和trunc的區(qū)別是round是四舍五入施无,trunc是直接去掉尾部辉词,各有優(yōu)劣看具體情況使用。
select round(sal,1) from emp where ename='JONES';
將JONES四舍五入猾骡,如果四舍五入完之后小數(shù)點(diǎn)后面有0則會默認(rèn)省去
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個(gè)命令都用來獲取薪資,只是后面小數(shù)不同比較區(qū)別即可
Select mod(2,1) from dual;
求2對1的余數(shù)
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;
顯示在一個(gè)月30天的情況下所有員工的日薪金敷搪,忽略余數(shù)
abs(n) 返回?cái)?shù)字的絕對值
acos(n) 返回?cái)?shù)字的反余弦值
asin(n) 返回?cái)?shù)字的反正弦值
atan(n) 返回?cái)?shù)字的正切值
cos(n) 返回?cái)?shù)字余弦值
exp(n) 返回e的n次冪
log(m,n) 返回對數(shù)值
power(m,n) 返回m的n次冪
轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)用于將一種類型轉(zhuǎn)化為另一種類型兴想。常用的轉(zhuǎn)換函數(shù)為to_char,將一種類型轉(zhuǎn)換成字符串類型赡勘。
to_char('日期','類型');
類型一般包含下面幾種
yy ? ? ? ? 兩位數(shù)字的年份 2001->04
yyyy ? ? 四位數(shù)字年份 2004
mm ? ? ?兩位數(shù)字的月份 8月->08
dd ? ? ? ?兩位數(shù)字的天數(shù) 30號->30
hh24 ? ?24進(jìn)制小時(shí) 下午八點(diǎn)->20
hh12 ? ?12進(jìn)制小時(shí) 下午八點(diǎn)->08
mi ? ? ? ?分鐘
ss ? ? ? ?秒
9 ? ? ? ? 顯示數(shù)字嫂便,并忽略前面0
0 ? ? ? ? 顯示數(shù)字,如位數(shù)不足闸与,則用0補(bǔ)齊
. ? ? ? ? ?指定位置顯示小數(shù)點(diǎn)
, ? ? ? ? ?指定位置顯示逗號
$ ? ? ? ? 數(shù)字前加美元
L ? ? ? ? 在數(shù)字前加本地貨幣符號(默認(rèn)$)
C ? ? ? ?在數(shù)字前加國際貨幣符號(默認(rèn)USD)
G ? ? ? ?在指定位置顯示組分隔符
D ? ? ? ?在指定位置顯示小數(shù)點(diǎn)符號
select to_date('2017/9/21','yyyy/mm/dd') from dual;
把一個(gè)字符串轉(zhuǎn)換成一個(gè)日期
select to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') from dual;
把一個(gè)日期轉(zhuǎn)換成字符串
select ename,hiredate from emp where to_char(hiredate,'yyyy')=1980;
顯示1980年入職員工
select to_char('88882345.45','L999G999G999D99') from dual;
結(jié)果 $88,882,345.45
系統(tǒng)函數(shù)
系統(tǒng)函數(shù)主要是用于查詢系統(tǒng)當(dāng)前的一些信息毙替,其是直接使用一些固定參數(shù)來獲取當(dāng)前系統(tǒng)的信息岸售。
syscontext('usernv','固定參數(shù)')
//usernv不可更改,sys_context函數(shù)最常用的就是userenv命名空間下的系列參數(shù)
terminal ? ? ? ? ? ? ? ? ? ? ?當(dāng)前會話客戶所對應(yīng)的的終端的標(biāo)識符
lanuage(language) ? ?語言
db_name ? ? ? ? ? ? ? ? ? 當(dāng)前數(shù)據(jù)庫名稱
nls_date_format ? ? ? ?當(dāng)前會話客戶所對應(yīng)的日期格式
session_user ? ? ? ? ? ? 當(dāng)前會話客戶所對應(yīng)的數(shù)據(jù)庫用戶名
current_schema ? ? ? ?當(dāng)前會話客戶所對應(yīng)的默認(rèn)方案名
host ? ? ? ? ? ? ? ? ? ? ? ? ? 返回?cái)?shù)據(jù)庫所在主機(jī)的名稱
單行函數(shù)
NVL(x,value) 它的功能是進(jìn)行內(nèi)容替換厂画,如果x為null凸丸,則NVL函數(shù)返回value的值,否則返回x本身的值
NVL2(x,value1,value2) 如果x非空袱院,則返回value1的值屎慢,否則返回value2的值
select ename,job,sal,nvl(comm,100) comm from emp where sal<2000;
查詢工資是2000元以下的員工的姓名,職位忽洛,工資和獎金腻惠,如果該人沒有獎金則每人發(fā)100元
select ename,sal+comm 總收入 from emp;
查詢每個(gè)人總收入(如果不用這種方法,因?yàn)楠劷鹩械臑榭沼椋詴?bào)錯(cuò))
select ename,sal 工資,nvl(comm,0) 獎金 from emp;
查詢每個(gè)人姓名集灌,工資,獎金
select ename,sal+nvl(comm,0) 總收入 from emp;
查詢每個(gè)人姓名复哆,總收入
其他例子:
select ename,sysdate-hiredate from emp;
對于每一個(gè)員工绝页,顯示其加入公司的天數(shù)
改進(jìn)為(去掉小數(shù)):select ename,trunc(sysdate-hiredate) from emp;