單行函數的功能非常的簡單就是完成某一個功能,例如:現在希望將字母變爲大寫,這樣的功能就可以通過單行函數完成,在Oracle之中提供的單行函數非常的多,今天主要是看核心的幾個。
單行函數分類爲:字符串函數、數字函數、日期函數、轉換函數、通用函數。所有的單行函數在進行記憶的時候都要求清楚的記下單行函數的名稱、返回值類型、接收的參數數據。
4.1、字符串函數
字符串函數的主要功能主要是進行字符串數據的處理,下面按照不同的類型來觀察函數的使用。
在Oracle之中爲了方便用戶進行函數的驗證,專門提供了一個dual的虛擬表,而關於這張表的相關概念,隨後再進行講解。
1、 大小寫轉換函數:
· 轉大寫:字符串 UPPER(字符串 | 數據列);
· 轉小寫:字符串 LOWER(字符串 | 數據列)。
範例:驗證函數 —— 直接在字符串數據上使用
SELECT UPPER('Hello'),LOWER('Hello') FROM dual ;
範例:驗證函數 —— 在列上使用(將所有僱員的姓名按照小寫字母的方式顯示)
SELECT LOWER(ename) FROM emp ;
通過以上的驗證可以清楚的發現,在使用UPPER()和LOWER()函數操作的時候是不關心提供的字符串數據是大寫還是小寫的,都會按照統一的規則轉換,那麼就可以實際之中利用這兩個函數進行一些數據的處理。例如:某些系統上用戶名是不區分大小寫的,而這樣的功能都是在數據保存的時候將保存的數據變爲統一的大寫或小寫。
範例:要求用戶輸入一個僱員的姓名,而後查詢出此僱員的詳細信息
· 那麼此時首先要解決的問題就是如何實現用戶的數據輸入,在Oracle數據庫裏提供了一種替代變量的可輸入操作。
SELECT * FROM &tablename ; è要查詢的數據表名稱由用戶輸入
輸入 tablename 的值: emp
原值 1:SELECT * FROM &tablename
新值 1:SELECT * FROM emp
· 那麼下面就利用替代變量輸入僱員姓名
SELECT * FROM emp WHERE ename=UPPER('&name') ;
工作之中如果有些系統不區分大小寫,那麼其主要的操作形式一定是按照統一的大寫或小寫保存數據,那麼就要使用到了UPPER()、LOWER()兩個函數。
2、 首字母大寫,其餘字母小寫:字符串 initcap(字符串 |列)
範例:將每一位僱員姓名的首字母大寫,其餘字母小寫
SELECT INITCAP(ename) FROM emp ;
3、 取得字符串長度:數字 LENGTH(字符串 |列)
範例:計算字符串的長度
SELECT LENGTH('hello world') FROM dual ;
範例:查詢出所有僱員姓名以及每個僱員姓名的長度
SELECT ename,LENGTH(ename) FROM emp ;
範例:查詢出所有僱員姓名的長度爲5的全部僱員信息
· 此時一定要增加WHERE子句來進行數據行的控制,同時還需要利用LENGTH()計算出名字長度
SELECT ename,LENGTH(ename)
FROM emp
WHERE LENGTH(ename)=5 ;
4、 替換指定字符串的內容:字符串 REPLACE(字符串 |列,要替換的內容,新的內容)
範例:替換字符串數據
SELECT REPLACE('hello world','l','_') FROM dual ;
範例:替換數據列
SELECT ename,REPLACE(ename,'A','_') FROM emp ;
5、 字符串截取操作:
· 由指定位置截取到結尾:字符串 SUBSTR(字符串 | 數據列,截取開始索引);
· 指定截取的開始和結束位置:字符串 SUBSTR(字符串 | 數據列,截取開始索引,截取結束索引);
範例:字符串截取 —— 由指定位置截取到結尾
SELECT SUBSTR('hello world',7) FROM dual ;
範例:字符串截取 —— 截取部分
SELECT SUBSTR('hello world',0,5) FROM dual ;
SELECT SUBSTR('hello world',1,5) FROM dual ;
實際上在Oracle之中,字符串的索引下標是從1開始的(程序是從0開始的),但是爲了考慮到程序人員的使用習慣,所以即使設置了0,那麼也表示從1開始,這一點會由Oracle自己進行處理。
範例:截取每一位僱員姓名的前三位字母
SELECT ename,SUBSTR(ename,1,3) FROM emp ;
範例:截取每一位僱員姓名的後三位字母
·傳統思路:對於後三位字母如果要想取得,那麼必須確定截取的開始位置,由於每一位僱員姓名的長度是不一樣的,所以截取的開始點也一定是不一樣的,那麼就只能通過計算長度後減去一定的數字纔可以得到正確的開始位置。
SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp ;
· 改善思路:在Oracle設計的時候,SUBSTR()函數就已經考慮到了由後向前的截取
SELECT ename,SUBSTR(ename,-3) FROM emp ;
面試題:請問Oracle之中的SUBSTR()函數進行截取的時候下標是從0還是從1開始?
·實際上從0還是從1開始沒有任何的區別,Oracle之中的字符串是從1開始的,但是即使設置了0,也表示從1開始,同時SUBSTR()函數還可以設置爲負數,表示由後的指定位置開始。
6、 去掉左右空格函數:字符串 TRIM(字符串 |列)
使用TRIM()函數可以去掉的只是左右空格,但是中間的空格是無法取消的。
範例:驗證TRIM()函數
SELECT ' helloworld ',TRIM(' helloworld ') FROMdual ;
這類的操作在進行數據接收的時候非常有用處。
4.2、數字函數
數字函數主要是針對於數字進行的一些小處理。
1、 四捨五入函數:數字 ROUND(數字 | 列[,保留小數位])
範例:驗證ROUND()函數
SELECT ROUND(9615.7652) , è 9616
ROUND(9615.7652,2) , è 9615.77
ROUND(9615.7652,-2) , è 9600
ROUND(-15.5) è -16
FROM dual ;
如果沒有編寫保留小數位數,那麼會將小數點之後的數據直接進行進位,不保留小數位。
2、 截取小數函數:數字 TRUNC(數字 | 列[,保留小數位])
範例:驗證TRUNC()函數
SELECT TRUNC(9615.7652) ,
TRUNC(9615.7652,2) ,
TRUNC(9615.7652,-2) ,
TRUNC(-15.5)
FROM dual ;
3、 求模:數字 MOD(數字1 |列1,數字2 | 列2)
範例:求餘數
SELECT MOD(10,3) FROM dual ;
以後在工作之中只要見到了ROUND這個單詞一定要清楚它的作用就是四捨五入。
4.3、日期函數
如果要想操作日期函數實際上有一個首要的問題需要解決。那麼必須要首先取得當前的系統日期時間,爲此在Oracle裏面提供有兩個僞列(是不存在表中的列,但是卻可以直接使用的列):SYSDATE、SYSTIMESTAMP。
範例:取得當前的系統日期
SELECT SYSDATE FROM dual ;
SELECT SYSTIMESTAMP FROM dual ;
當有了系統日期之後就可以通過以下的三個公式來進行一些簡單的計算:
· 日期 + 數字 =日期,表示若干天之後的日期;
· 日期 – 數字 =日期,表示若干天之前的日期;
· 日期 – 日期 =數字,表示兩個日期之間的間隔天數。
範例:計算若干天之後的日期
SELECT SYSDATE + 3 , SYSDATE + 120 FROM dual ;
範例:計算若干天之前的日期
SELECT SYSDATE - 120 FROM dual ;
計算的時候是按照自然日的天數進行的計算,是不會去考慮那個月有30天,有28天之類的。
範例:統計出每一位僱員到今天爲止僱傭的天數
SELECT ename, SYSDATE - hiredate FROM emp ;
但是如果在一個很長的時間之內通過天數計算年是絕對不準確的。所以如果要想準確的計算出天數,那麼前後的差距不要超過30天。
如果要想準確的進行日期時間的操作,那麼就必須利用提供的日期函數。
1、 計算兩個日期之間所經歷的月數:數字 MONTHS_BETWEEN(日期1 |列1,日期2 |列2)
範例:計算每一位僱員到今天爲止僱傭的年數
· 年數的計算最準確的一定是通過月完成的,一年12個月是不會被改變的。
SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate) ,
MONTHS_BETWEEN(SYSDATE,hiredate)/12
FROM emp ;
SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate) ,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12)
FROM emp ;
範例:查詢出所有已經被僱傭了33年以上的僱員
SELECT * FROM emp
WHERE MONTHS_BETWEEN(SYSDATE,hiredate)/12>33 ;
2、 加上指定月之後的日期:日期 ADD_MONTHS(日期 | 列,月數)
範例:計算若干月之後的日期
SELECT SYSDATE+120,ADD_MONTHS(SYSDATE,4),ADD_MONTHS(SYSDATE,500)FROM dual ;
在進行計算的時候,數字的大小是不受限制的。
思考題:要求計算出每一位僱員到今天爲止僱傭的年限(理解)
A、 例如:今天是2014年08月12日,CLARK的僱傭日期是:1981年06月09日
B、 到今天CLARK已經在公司服務了:33年、02月、03天
第一步:計算出每一位僱員到今天爲止的僱傭年份,直接利用月數除12即可
SELECT ename,hiredate, TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year
FROM emp ;
第二步:計算月,在進行年計算的時候發現存在有小數,這些小數就包含了月
SELECT ename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year ,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) months
FROM emp ;
第三步:計算天數,對於天數的計算實際上只學會了一個公式“日期1 – 日期2 = 天數”,於是分析日期:
· 日期1:應該是當前日期“SYSDATE”;
· 日期2:應該是已經剔除掉了經過月之後的日期。
SELECT ename,hiredate,
TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate)/12) year ,
TRUNC(MOD(MONTHS_BETWEEN(SYSDATE,hiredate),12)) months ,
TRUNC(SYSDATE -ADD_MONTHS(hiredate,MONTHS_BETWEEN(SYSDATE,hiredate))) day
FROM emp ;
只有日期函數可以準確的計算出日期來,其它的直接操作都無法進行。
3、 求出指定的下一個一週時間數的日期:日期 NEXT_DAY(日期 |列,一週時間數)
範例:計算下一個星期二
SELECT NEXT_DAY(SYSDATE,'星期二') FROM dual ;
4、 求出指定日期所在月的最後一天日期:日期 LAST_DAY(日期 |列)
範例:求出本月的最後一天日期
SELECT LAST_DAY(SYSDATE) FROM dual ;
範例:查詢出在每個僱員僱傭所在月倒數第二天僱傭的全部僱員信息
· 每一個僱員僱傭日期是不同的,那麼僱傭所在月也一定是不同的;
· 倒數第二天應該使用:“僱傭所在月最後一天-2”,可以通過LAST_DAY()函數計算。
SELECT ename,hiredate,LAST_DAY(hiredate)-2
FROM emp
WHERE LAST_DAY(hiredate)-2=hiredate ;
所有的日期函數實際上在進行一些統計操作的時候還是有用處的。
4.4、轉換函數
那麼到現在爲止已經接觸到了Oracle中提供的三類數據:字符串、數字、日期,那麼這三種數據之間是可以通過一些轉換函數實現類型轉換操作的。
1、 轉字符串數據:字符串 TO_CHAR(數字 | 日期| 列,轉換格式)
在進行轉換格式設置的時候要根據不同的數據類型進行格式標記的定義:
·日期:年(yyyy)、月(mm)、日(dd)、時(HH、HH24)、分(mi)、秒(ss);
·數字:一位任意數字(9)、本地貨幣(L)。
範例:將日期格式化爲字符串
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd') FROM dual ; è 2014-08-12
SELECT TO_CHAR(SYSDATE,'fmyyyy-mm-dd') FROM dual ; è 2014-8-12
範例:在Oracle的SYSDATE裏面是包含有時間數據的,也可以繼續顯示時間
SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual ;
那麼實際上用戶也可以利用TO_CHAR()函數進行年、月、日數據的拆分。
範例:拆分日期數據
SELECT TO_CHAR(SYSDATE,'yyyy') year ,
TO_CHAR(SYSDATE,'mm') months ,
TO_CHAR(SYSDATE,'dd') day
FROM dual ;
範例:查詢出所有在2月份僱傭的僱員
SELECT * FROM emp WHERE TO_CHAR(hiredate,'mm')='02' ;
使用TO_CHAR()還可以格式化數字顯示。
範例:格式化數字顯示
SELECT TO_CHAR(234789234798,'L999,999,999,999,999') FROM dual;
2、 轉日期數據:日期 TO_DATE(字符串,轉換格式)
範例:將字符串變爲日期
SELECT '1981-09-15',TO_DATE('1981-09-15','yyyy-mm-dd') FROM dual;
但是在Oracle之中提供有自動的轉換方式,如果字符串按照日期的格式編寫,那麼可以自動由字符串變爲日期。
3、 轉數字類型:數字 TO_NUMBER(字符串,轉換格式)
範例:將字符串變爲數字
SELECT TO_NUMBER('1') + TO_NUMBER('2') FROM dual ;
SELECT '1' + '2' FROM dual ;
在Oracle裏面這些自動的數據類型轉換功能是非常方便的,包括日期和字符串、字符串和數字。
4.5、通用函數
通用函數主要是Oracle的特色函數,有兩個:NVL()、DECODE()。
1、 處理null數據:數字 NVL(列 |數據,默認值)
範例:要求計算每一位僱員的年薪
SELECT ename,sal,comm,(sal+comm)*12 FROM emp ;
這個時候發現有一部分人是沒有年薪的,而這部分人都是沒有佣金的,因爲在數據庫之中,null與任何的數據進行數學計算其結果都是null,那麼如果遇到了null應該按照數字0來處理,所以就可以使用NVL()函數。
SELECT ename,sal,comm,(sal+NVL(comm,0))*12 FROM emp ;
2、 多數據判斷:數據 DECODE(字段 |數據,判斷數據1,顯示數據1,判斷數據2,顯示數據2,… [默認顯示])
範例:將所有僱員的職位數據變爲中文
SELECT ename,job ,
DECODE(job,'CLERK','辦事員','SALESMAN','銷售','MANAGER','經理','ANALYST','分析員','PRESIDENT','總裁','未處理')
FROM emp ;
非常類似於IF..ELSE IF語句。
本文轉載自微博用戶:MLDN李興華的微博 地址:http://weibo.com/p/1035052004834713/wenzhang?cfs=600&Pl_Core_ArticleList__66_filter=&Pl_Core_ArticleList__66_page=11#Pl_Core_ArticleList__66