Oracle函數


select單表查詢語句--使用函數

使用函數可以大大提高SELECT語句操作數據庫的能力;它給數據的轉換和處理提供了方便。函數只是將取出的數據進行處理,不會改變數據庫中的值。
Oracle函數分為單行函數多行函數兩大類
【單行函數】
單行函數分類:字符函數 數值函數 日期函數 轉換函數 通用函數
--特點1:不改變真實數據,只對數據做了進一步的修飾顯示
--特點2:可以和字段混合使用
--字符函數:select 字段名,函數名(字段名),字段名... from 表名;
多行函數:sum() avg() 僅適用數值型   count() max() min() 適用任何類型數據
偽表:[不是真實存在的表,是為了方便進行數據的驗證臨時存在的表,表名:dual]

【常用字符函數】:

字符函數舉栗子:

 1 --舉栗子【字符函數】
 2 --1.首字母大寫:查詢emp表中姓名列首字符大寫
 3 select ename,initcap(ename) as "首字母大寫" from emp;
 4 --2.轉為小寫:查詢emp表中的職位全部小寫顯示
 5 select job,lower(job) as "職位小寫顯示" from emp;
 6 --3.轉為大寫:查詢emp表中的姓名全部大寫顯示
 7 select ename,upper(ename) as "姓名大寫" from emp;
 8 --4.左裁剪:ltrim('ltrimHello world','ltrim')=>Hello world
 9 select ltrim('ltrimHello world','ltrim') from dual;
10 --5.右裁剪:rtrim('Oracle1234','1234')=>Oracle
11 select rtrim('Oracle1234','1234') from dual;
12 --6.按字符翻譯:abcd按字符翻譯成boom=>boom404
13 select translate('abcd404','abcd','boom') from dual;
14 --7.字符串替換:把java替換成oracle=>hello oracle
15 select replace('hello java','java','oracle') from dual;
16 --8.查找子串位置:查找下標從1開始,並不是從0
17 select instr('caoyinboom404','y') from dual;
18 --9.取子字符串:從第7個開始截取,取出后面7個字符
19 select substr('caoyinboom404',7,7) from dual;
20 --10.連接字符串
21 select concat('hello',' oracle') from dual;
View Code

【常用數值函數】:

數值函數舉栗子:

 1 --舉栗子【數值函數】
 2 --1.絕對值
 3 select abs(-9) from dual;
 4 --2.向上取整:不管小數點第一位是幾,都進以為數值
 5 select ceil(55.12) from dual;
 6 --3.正弦
 7 select sin(45) from dual;
 8 --4.余弦
 9 select cos(45) from dual;
10 --5.取符號:正數 1、負數-1
11 select sign(5) from dual;
12 select sign(-5) from dual;
13 --6.向下取整:相當於只取出整數部分.小數部分忽略不計
14 select floor(99.99) from dual;
15 --7.m的n次冪
16 select power(5,2) from dual;
17 --8.取余數:是否帶符號取決於左邊的數值,[不存在- - 得 +]
18 select mod(10,8) from dual;-- 2
19 select mod(-10,8) from dual;-- -2
20 select mod(10,-8) from dual;-- 2
21 select mod(-10,-8) from dual;-- -2【不存在負負得正】
22 --9.四舍五入
23 select round(10.49) from dual;
24 --10.保留小數位
25 select trunc(10.98170,2) from dual;
26 --11.平方根
27 select sqrt(16) from dual;
View Code

【常用日期函數】:

日期函數舉栗子:

 1 --舉栗子【日期函數】
 2 --1.返回兩個日期間的月份:月份在前,否則就負值
 3 select months_between('01-8月-2018','01-6月-2018') from dual;
 4 --2.返回月份數添加到日期對應的新日期:參數2:相當於加減月份
 5 select add_months('01-8月-2018',1) from dual;--2018/9/1 星期六
 6 select add_months('01-8月-2018',-2) from dual;--2018/6/1 星期五
 7 --3.返回指定日期后的星期對應的新日期
 8 select next_day('02-10月-2018','星期一') from dual;--查詢最近星期的日期。2018/10/8 星期一
 9 --4.返回指定日期所在月份的最后一天
10 select last_day('02-2月-2018') from dual;--2018/2/28 星期三
11 
12 --5.按指定格式對日期進行四舍五入【掙扎了好久,外國的日期跟中國的習慣不一樣,不必要糾結日期這段,跳過去】
13 
14 --指定年份:年的四舍五入按月份算
15 select round(to_date('30-6月-03'),'YEAR') from dual;--2003/1/1 星期三
16 select round(to_date('21-7月-03'),'YEAR') from dual;--2004/1/1 星期四
17 --指定月份:月的四舍五入按日份算
18 select round(to_date('15-8月-03'),'MONTH') from dual;--2003/8/1 星期五
19 select round(to_date('16-9月-03'),'MONTH') from dual;--2003/10/1 星期三
20 --指定日:按星期的中間天數
21 select round(to_date('01-10月-2018'),'DAY') from dual;
22 select round(to_date('01-4月-2018'),'DAY') from dual;
View Code

【多行函數】
【多行函數】:對一組數據進行運算,針對一組數據(多行記錄)只返回一個結果,也稱分組函數。
--多行函數不能和普通字段值及單行函數混合使用,除非分組
--作用:對查詢數據進行統計
--使用:select 多行函數名(字段名),多行函數名(字段名)...from 表名;

常用多行函數:sum() avg() 僅適用數值型   count() max() min() 適用任何類型數據
--max(字段名)返回該字段的最大值
--min(字段名)返回該字段的最小值
--sum(字段名)返回該字段的和
--avg(字段名)返回該字段的平均值
--count
 --count(*)返回表的記錄數
 --count(字段名)返回非空值的數量
 --count(distinct 字段名)去除重復后的字段值的數量
多行函數舉栗子:

 1 --查詢員工的最高工資
 2 select max(sal) from emp;
 3 --查詢員工的最底工資
 4 select min(sal) from emp;
 5 --查詢員工的平均工資
 6 select avg(sal) from emp;
 7 --查詢所有員工的平均工資之和
 8 select sum(sal) from emp;
 9 --查詢公司有多少員工
10 select count(*) from emp;--查詢表的記錄數
11 --查詢有獎金的員工人數
12 select count(comm) from emp;--查詢字段的值的數量,null自動過濾
13 --查詢公司有多少工作種類
14 select distinct job from emp;
15 select count(distinct job)from emp;

【轉換函數】
轉換函數:Oracle的類型轉換分為自動類型轉換和強制類型轉換。數據類型之間可以進行自動轉換,仍建議使用顯示轉換函數,以保持良好的設計風格。
常用類型轉換函數有:
--to_number(數值類型的字符):將字符轉換為數值
--to_char(數值或者是日期):將數值或者日期轉換為字符
--to_date(日期格式的字符):將字符轉換為日期

 1 ---------------------數值和字符的互轉---------------------
 2 --字符轉換數字char --> number
 3 select to_number('1999')+1 from dual;
 4 --數字轉換字符number --> cahr
 5   --指定顯示格式:
 6     --9表示位置的占位:eg:999,999,999=>三位一組使用逗號隔開
 7     --L表示人民幣符號
 8     --$表示美元符號
 9     --0也可以占位分組,但若真實數據位數不足,會使用0進行補位
10 select to_char(987654321,'¥999,999,999')from dual;
11 select to_char(123456789,'$999,999,999')from dual;
12 select to_char(123456789,'000,000,000,000.000')from dual;
13 --查詢工資大於2000的員工信息
14   --數值和字符之間的轉換可以隱式轉換.to_number可缺省
15 select * from emp where sal>'2000'--存在隱式自動轉換 to_number('2000')
16 select '154'+2 from dual;
 1 ---------------------日期和字符的互轉---------------------
 2 --字符轉換日期 cahr-->date
 3  --查詢員工入職日期在82年之后的信息
 4  --使用to_date('要轉的字符','日期格式')函數將字符轉換為日期
 5    --注意1:字符必須符合日期格式
 6    --注意2:Oracle默認的轉換格式為日月年,'01-1月-2018'
 7    --常用日期格式:yyyy-mm-dd     yyyy/mm/dd
 8 select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1982-01-01';
 9 select * from emp where hiredate>to_date('1982-01-01','yyyy-mm-dd');
10 select * from emp where hiredate>to_date('1982-01-01','yyyy/mm/dd');
11 --日期轉換字符 date-->char
12   --使用to_char('要轉的日期','轉換格式')
13   --注意1:不指定轉換格式,使用默認格式,日月年:'01-01月-18'
14 select to_char(hiredate) from emp;--默認格式
15 --指定格式
16 select to_char(hiredate,'yyyy-mm-dd') from emp;
17 select to_char(hiredate,' yyyy"年" mm"月" dd"日" ') from emp;

【其他函數】

1 --查詢員工的薪水信息:如果獎金等於null,就返回0;不等於0,sal+comm 在進行計算相加
2 select ename,sal,comm,sal+nvl(comm,0) as "工資+獎金" from emp;
3 select ename, sal, comm, nvl2(comm, sal+comm, sal) as "工資+獎金" from emp;

--decode (value, key0,value0,key1,value 1,..... ,valuen)
--參數的意思,如果 value 的值 是 key0? 整個函數返回 value0 ,如果值是key1就返回value1,以此類推,如果都沒有找到合適,最后返回 valuen。

--decode(字段名,值1,處理1,值2,處理2,值3,處理3,...公共處理)
--如果字段的值和decode中的條件相同則執行對象的處理,都不是就則執行公共處理

1 --將emp 表中所有的員工的名字 工作 以及工作中文顯示
2 select ename, job, decode(job,'CLERK','職員','SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師') 中文職業 from emp;
3 --職位除了:(job,'SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師')其他都是職員
4 --處理大量的其他使用:比如:幾萬數據,除了職稱為管理員和老師之外的其他都是學生
5 select ename, job, decode(job,'SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師','職員') 中文職業 from emp;




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM