oracle--單行函數和多行函數
- 2019 年 10 月 10 日
- 筆記
單行函數
1、字元函數
函 數 | 功 能 | 示 例 | 結 果 |
|---|---|---|---|
INITCAP (char) | 首字母大寫 | initcap ('hello') | Hello |
LOWER (char) | 轉換為小寫 | lower ('FUN') | fun |
UPPER (char) | 轉換為大寫 | upper ('sun') | SUN |
LTRIM (char, set) | 左剪裁 | ltrim ('xyzadams', 'xyz') | adams |
RTRIM (char, set) | 右剪裁 | rtrim ('xyzadams', 'ams') | xyzad |
TRANSLATE (char, from, to) | 按字元翻譯 | translate ('jack', 'abcd', '1234') | j13k |
REPLACE (char, search_str, replace_str) | 字元串替換 | replace ('jack and jue', 'j', 'bl') | black and blue |
INSTR (char, substr[, pos]) | 查找子串位置 | instr ('worldwide', 'd') | 5 |
SUBSTR (char, pos, len) | 取子字元串 | substr ('abcdefg',3,2) | cd |
CONCAT (char1, char2) | 連接字元串 | concat ('Hello', 'world') | Helloworld |
2、數值函數
函 數 | 功 能 | 示 例 | 結 果 |
|---|---|---|---|
ABS(n) | 取絕對值 | abs(-15) | 15 |
CEIL(n ) | 向上取整 | ceil(44.778) | 45 |
SIN(n) | 正弦 | sin(1.571) | .999999979 |
COS(n) | 餘弦 | cos(0) | 1 |
SIGN(n) | 取符號 | sign(-32) | -1 |
FLOOR(n) | 向下取整 | floor(100.2) | 100 |
POWER(m,n ) | m的n次冪 | power(4,2) | 16 |
MOD(m,n) | 取餘數 | mod(10,3) | 1 |
ROUND(m,n) | 四捨五入 | round(100.256,2) | 100.26 |
TRUNC(m,n) | 截斷 | trunk(100.256,2) | 100.25 |
SQRT(n) | 平方根 | sqrt(4) | 2 |
3、日期函數
函 數 | 功 能 | 示 例 | 結 果 |
|---|---|---|---|
MONTHS_BETWEEN | 返回兩個日期間的月份 | months_between ('04-11月-05','11-1月-01') | 57.7741935 |
ADD_MONTHS | 返回把月份數加到日期上的新日期 | add_months('06-2月-03',1) add_months('06-2月-03',-1) | 06-3月-03 06-1月-03 |
NEXT_DAY | 返回指定日期後的星期對應的新日期 | next_day('06-2月-03','星期一') | 10-2月-03 |
LAST_DAY | 返回指定日期所在的月的最後一天 | last_day('06-2月-03') | 28-2月-03 |
ROUND | 按指定格式對日期進行四捨五入 | round(to_date('13-2月-03'),'YEAR') round(to_date('13-2月-03'),'MONTH') round(to_date('13-2月-03'),'DAY') | 01-1月-03 01-2月-03 16-2月-03 |
TRUNC | 對日期按指定方式進行截斷 | trunc(to_date('06-2月-03'),'YEAR') trunc(to_date('06-2月-03'),'MONTH') trunc(to_date('06-2月-03'),'DAY') | 01-1月-03 01-2月-03 02-2月-03 |
4、轉換函數


日期格式元素 | 含義 |
|---|---|
YYYY、YY | 代表四位、兩位數字的年份 |
MM | 用數字表示的月份 |
MON | 月份的縮寫、對中文月份來說就是全稱 |
DD | 數字表示的日 |
DY | 星期的縮寫,對中文的星期來說就是全稱 |
HH24,HH12 | 12小時或者24小時進位下的時間 |
MI | 分鐘數 |
SS | 秒數 |
數字格式元素 | 含義 |
|---|---|
9 | 代表一位數字,如果該位沒有數字則不進行顯示,但對於小數點後面的部分仍會強制顯示 |
0 | 代表一位數字,如果該位沒有數字則強制顯示0 |
$ | 顯示美元符號 |
L | 顯示本地貨幣符號 |
. | 顯示小數點 |
, | 顯示千分位符號 |


其他函數
nvl() nvl2() decode()
函 數 | 功 能 |
|---|---|
NVL(EXP1, EXP2) | 如果exp1的值為null,則返回exp2的值,否則返回exp1的值 |
NVL2(EXP1, EXP2, EXP3) | 如果exp1的值為null,則返回exp2的值,否則返回exp3的值 |
DECODE(VALUE,IF1,THEN1, IF2,THEN2,……,ELSE) | 如果value的值為if1,則返回then1的值,如果value的值為if2,則返回then2的值,……,否則返回else值 |

多行函數


單行函數學習 --查詢工作為SALESMAN,MANAGER並且工資大於2500的員工資訊 --1、使用小括弧提升where篩選條件的執行優先順序別 --2、and的優先順序別高於or select * from emp select * from emp where job='SALESMAN' or job='MANAGER' and sal>2500 select * from emp where (job='SALESMAN' or job='MANAGER') and sal>2500 ----------------------------------------------------------------------------------------------------------- 使用函數 單行函數 多行函數 轉換函數 其他函數 --單行函數學習:不改變原始數據,只改變結果 ---1、字元函數 select * from emp; select INITCAP(ename) from emp;--initcap函數將首字母大寫 select lower(ename)from emp;--lower 字母小寫 select replace(ename,'S','M') from emp;--replace 替換 --2、數值函數--Math ----偽表 dual select * from dual select abs(-3) 絕對值,ceil(3.1415926)向上取整,floor(3.1415926)向下取整,power(2,3)冪,round(3.4)四捨五入 from dual --3、日期函數 select months_between('13-12月-2016','13-10月-2016') from dual--months_between兩個日期之間的月份數 多行函數學習 多行函數 : max: max(欄位名) 返回此欄位的最大值 min:min(欄位名) 返回此欄位的最小值 avg:avg(欄位名) 返回平均值 sum:sum(欄位名) 返回欄位的和 count:count --count(*),用來查詢表中有多少條記錄 --count(欄位名),用來查詢某個欄位有值的個數 --count(distinct 欄位名),可以先去除重複再計數。 注意: --多行函數不能和普通欄位直接出現在查詢語句中,除非group by --多行函數和單行函數不能直接出現在查詢語句中,除非group by 查看員工的最高工資 select max(sal),ename from emp--多行函數不能和普通欄位直接出現在查詢語句中,除非group by select max(sal),lower(ename) from emp--多行函數和單行函數不能直接出現在查詢語句中,除非group by select ename from emp 查看員工的最低工資 select min(sal) from emp 查看員工的平均工資 select avg(sal) from emp 查看所有的員工工資之和 select sum(sal) from emp 查詢公司有多少員工 select * from emp select count(*) from emp--使用count(*)來查看一張表中有多少條記錄 查詢有津貼的員工人數 select count(comm) from emp--使用count(欄位名),查詢該欄位有值的記錄數 select count(ename) from emp 查詢公司有多少工作種類 select count(job) from emp select count(distinct job) from emp 轉換函數學習 轉換函數:在轉換的時候改變的是數據的類型,數據內容不會改變,可以指定格式。 1、to_number:將數字字元轉換為數字類型的數值,to_number(數字字元) 2、to_char:將數字轉換為字元類型,將日期轉換為字元類型 to_char(數字/日期) 3、to_date:將字元類型的日期轉換為日期類型: to_date(char) -------------------------------------------------------------------------------------- number-->char 轉換的時候使用的是默認格式, select to_char(123) from dual--將數字轉換為字元類型,使用to_char(number) select sal, to_char(sal) from emp number-->char 使用指定的格式 to_char(number,'格式'),格式: $代表美元符,9程式碼數字佔位。例如,L999,999,999表示三位一組的顯示方式L代表人民幣符號,0代表保留數字個數,不足使用0補充。 select to_char(sal),to_char(sal,'L999,999,999') from emp select to_char(sal),to_char(sal,'L0000.00') from emp char--->number to_number(數字字元) select to_number('123') from dual char--->date,轉換的字元必須是日期格式的字元串,默認格式 dd-mm-yyyy 注意:因為字元串有很多,所以在字元轉換為日期的時候,需要指定格式,因為日期是具備一定格式的字元組合。 字元轉換為日期的時候,指定的格式為字元的日期順序,無需指定間隔符。 yyyy:表示年 mm:表示月 dd表示日 select to_date('05-12月-2016') from dual; select to_date('2016-05-12','yyyy-mm-dd') from dual--使用指定的格式將指定的日期字元串轉換為日期 select to_date('12-05-2016','mm/dd/yyyy') from dual date--->char 注意:因為日期本身就具備一定的格式在不是指定格式的情況下會默認使用dd-mm-yyyy格式顯示數據 指定的格式會作為日期轉換為字元串類型的顯示格式存在。例如: yyyy-mm-dd' 『2016-12-05』 yyyy/mm/dd' '2016/12/05' yyyy"年"mm"月"dd"日"' 2016年12月05日 select hiredate,to_char(hiredate) from emp--日期轉換為字元的時候,不指定格式使用默認格式:dd-mm-yyyy select hiredate,to_char(hiredate,'yyyy-mm-dd') from emp;--使用指定格式將日期轉換為字元串類型 select hiredate,to_char(hiredate,'yyyy/mm/dd') from emp;--使用指定格式將日期轉換為字元串類型 select hiredate,to_char(hiredate,'yyyy"年"mm"月"dd"日"') from emp;--使用指定格式將日期轉換為字元串類型 查詢入職日期在81年10月20日後的員工資訊 第一種:自動轉型 select * from emp where hiredate>'20-10月-1981' 第二種:將日期轉換為字元串 select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1981-10-20' 第三種: select * from emp where hiredate>to_date('1981-10-20','yyyy/mm/dd') 其他函數: 單行函數:lower 多行函數:min max sum avg count 轉換函數:to_number to_char to_date ----------------------------------------------------------------------------------------- 其他函數: 1、nvl():nvl(欄位名,執行)--相當於java中的if條件判斷 2、nvl2():nvl2(欄位名,值,值)--相當於java中的If(){}else{}判斷 3、decode():decode(欄位名,條件1,執行內容1,條件2,執行內容2,條件3,執行內容3,默認執行內容) 相當於java中if(){}else if(){}else if(){}...else{} 查詢所有員工的月薪及姓名和工作 select * from emp select ename,sal 基本工資,comm 績效,sal+comm 月薪 from emp select ename,sal 基本工資,comm 績效,sal+nvl(comm,0)月薪 from emp 查詢所有員工的月薪及姓名和工作 select ename,sal 基本工資,comm 績效,nvl2(comm,sal+comm,sal)月薪 from emp 顯示員工的職稱 select ename,job,decode(job,'MANAGER','經理','SALESMAN','銷售人員','普通員工') from emp單行函數分類 字元函數 數值函數 日期函數 轉換函數 通用函數 多行函數 sum() avg() 僅適用數值型 count() max() min() 適用任何類型數據