Oracle 10g數據庫基礎之基本查詢語句-中-函數數據庫
使用函數的目的是爲了操做數據express
將輸入的變量處理,返回一個結果。session
變量能夠有好多。ide
傳入的變量能夠是列的值,也能夠是表達式。函數
函數能夠嵌套。性能
內層函數的結果是外層函數的變量。spa
單行函數:每一行都有一個返回值,但能夠有多個變量。設計
多行函數:多行有一個返回值。code
字符操做函數unicode
數字操做函數
日期操做函數
數據類型轉換函數
綜合數據類型函數
Lower,upper,initcap 小寫大寫首字母大寫
大小寫操做函數
字符串操做函數
該實驗的目的是掌握經常使用的字符串操做的函數.
字符串的大小寫操做
SQL> select lower(' mf TR') 小寫字母, upper('mf TR') 大寫字母, initcap('mf TR') 首字母大寫 from dual;
Dual是虛表,讓咱們用表的形式來訪問函數的值。
字符串操做函數
其它字符串操做函數
下面三句話是求字符串的長度,字符串要單引。
select lengthc('張三') from dual;--unicode的長度
substr截取字符串
substr(字符串,m,n),m是從第幾個字符開始,若是爲負的意思是從後邊的第幾個開始。N是數多少個,若是不說就是一直到字符串的結尾
SQL> select ename,substr(ename,1,1) "第一個字母",substr(ename,-2) "最後兩個字母"from emp;
Lpad和rpad字符填充
SQL> select lpad(ename,20,'*') ename,rpad(ename,20,'。') ename from emp;
左填充和右填充,20是總共填充到多少位,*和。是要填充的字符串。
Lpad左填充,rpad右填充,通常的用途是美化輸出的結果。
REPLACE替換字符
將字符串中的J所有替換位xj_
該實驗的目的是掌握經常使用的關於數字操做的函數.
ROUND,TRUNC數字操做函數
以小數點位核心,2是小數點後兩位,0能夠不寫,表示取整,-1表示小數點前一位
ROUND是四捨五入:
SQL> SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL;
TRUNC是截斷,所有捨棄:
SQL> SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-2) FROM DUAL;
該實驗的目的是掌握經常使用的關於日期操做的函數.
日期是很特殊的數據類型,用好了能夠提升數據庫的性能,而使用不當每每是錯誤的根源,若是你使用字符型數據來存儲日期,就放棄日期特有的計算功能。
函數SYSDATE求當前數據庫的時間。
日期的顯示格式和客戶端的配置相關。
SQL> select * from nls_session_parameters
where parameter='NLS_DATE_FORMAT';
表明的含義是凡是列的名稱是value的,都按照20個寬度來顯示,你想取消該列的定義
col value clear,其中col是column的縮寫。你想查看幫助help column便可
從新設定爲咱們想要的格式。
查看系統時間,數據庫自己沒有時間,它有scn號,和咱們的時間不一樣。
設定爲默認的顯示格式
再次查看,咱們發現日期的顯示隨着客戶端的格式變化而變化。
日期的內部存儲都是以yyyymmddhh24miss存在數據庫中
兩個日期相減的結果單位爲天,每每是帶小數點。咱們經過函數能夠取整。
SQL> select months_between(sysdate,hiredate) 兩個日期的月間隔,sysdate,hiredate from emp;
SQL> select sysdate 今天, add_months(sysdate,6) 六個月後 from dual;
SQL> select next_day(hiredate,5) ,hiredate from emp;
select hiredate,round(hiredate,'yyyy') ,round(hiredate,'year') from emp;
select hiredate,trunc(hiredate,'yyyy') ,trunc(hiredate,'year') from emp;
數字的進位和截取是以小數點爲中心,咱們取小數點前或後的值,而日期的進位和截取是以年,月,日,時,分,秒爲中心。
字符串能夠轉化爲數字和日期。
數字要合法,日期要格式匹配。
數字和日期在賦值的時候也能夠轉爲字符串,但在表達式的時候不能夠轉換。
SQL> select ename,to_char(hiredate,'yyyy/mm/dd') from emp;
SQL> select ename,to_char(hiredate,'fmyyyy/mm/dd') from emp;
其餘格式:year,month,mon,day,dy,am,ddsp,ddspth
SQL> select to_char(hiredate,'fmyyyy "年" mm "月" dd "日"') from emp;
select sysdate,to_char(sysdate,'sssss') ss from dual;
格式爲9,0,$,l,.
SQL> select ename,to_char(sal,'9999.000') salary from emp;
SQL> select ename,to_char(sal,'$00099999000.00' ) salary from emp;
SQL> select ename,to_char(sal,'l99,999.000') salary from emp;
SQL> select ename,TO_char(sal,'9G999D99') salary from emp;
9是表明有多少寬度,若是不足會顯示成######,0表明強制顯示0,但不會改變你的結果。G是千分符,D是小數點。
在數據庫中16進制的表達是按照字符串來描述的,因此你想將十進制的數轉換爲十六進制的數使用to_char函數。
其中xxxxx的位數要足夠,否則報錯,你就多寫幾個,足夠大就能夠。
若是你想將十六進制的數轉換爲十進制的數請使用to_number函數。
SQL> select to_number('abc32','xxxxxxxx') from dual;
日期是格式和語言敏感的,切記!
G爲千分符,D爲小數點
RR和yy日期數據類型
select to_char(sysdate,'yyyy') "當前",
結果爲
yy是兩位來表示年,世紀永遠和說話者的當前世紀相同。
RR比較靈活,它將世紀分爲上半世紀和下半世紀。若是你處於上半世紀,描述的是0-49,那麼就和當前世紀相同,描述的是50-99就是上世紀。若是你處於下半世紀,描述的是0-49,那麼是下個世紀,描述的是50-99就是當前世紀。從而能夠看出,RR的設計徹底爲了1990年到2010之間咱們的思惟習慣而設計的。當咱們時間到2050先後,使用起來就很是的彆扭。
該實驗的目的是掌握經常使用的關於NULL值操做的函數.
若是expr1爲非空,就返回expr1, 若是expr1爲空返回expr2,兩個表達式的數據類型必定要相同。
若是expr1爲非空,就返回expr2, 若是expr1爲空返回expr3
若是expr1和 expr2相同就返回空,不然返回expr1
返回括號內第一個非空的值。
有獎金就返回獎金,獎金爲空就返回0。
select ename 姓名,sal 工資,comm 獎金,sal+nvl(comm,0) 總工資,nvl2(comm,'工資加獎金','純工資') "收入類別" from emp;
SQL> select ename 姓名,COALESCE(comm,0) "獎金" from emp;
若是有獎金就返回獎金,若是沒有獎金就返回0,起個別名叫作"獎金"。
該實驗的目的是掌握分支操做的函數.
Case語句
9I之後才支持的新特性,說叫語句實際上是函數。目的是爲了分支。
例題:判別job,不一樣工做的人賦予不一樣的工資,除了CLERK,SALESMAN,ANALYST之外,其它的人工資不變,將函數的值起一個別名爲"處理後數據"。
ELSE sal END "處理後數據"
Decode函數:
和CASE語句同樣都是分支語句,但Decode函數是ORACLE本身定義的,其它數據庫可能不支持。
語法以下:
例題:判別job,不一樣工做的人賦予不一樣的工資,除了CLERK,SALESMAN,ANALYST之外,其它的人工資不變,將函數的值起一個別名爲"處理後數據"。
, sal ) "處理後數據"
不一樣工資上的稅率不一樣。每2000一個臺階,8000以上一概40%的稅。
該實驗的目的是掌握經常使用的組函數.理解group by的操做.
1。組函數
2。分組統計
3。NULL值在組函數中的做用
4。HAVING的過濾做用
5。組函數的嵌套
這種函數每次處理多行,給出一個返回值
Avg平均
Sum求和
Max最大
Min最小
Count計數
全部組函數,除了count(*)之外,都忽略null值,count是計數,查看有多少行,count(列)是查看該列有多少非空的行。
Group by 子句
Having是在結果中再次篩選。Having必定得出如今group by 子句得後面。不能獨立存在。
組函數的嵌套注意要使用GROUP BY子句。
巧用DECODE函數,改變排版方式
SQL>select sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) "1980",
《完》
--xjzhujunjie
--2012/05/17