Oracle 10g數據庫基礎之基本查詢語句-中-函數

 Oracle 10g數據庫基礎之基本查詢語句-中-函數

--資料參考:張烈 張建中《數據庫管理員培訓講義》
函數:

使用函數的目的是爲了操作數據

將輸入的變量處理,返回一個結果。

變量可以有好多。

傳入的變量可以是列的值,也可以是表達式。

函數可以嵌套。

內層函數的結果是外層函數的變量。

單行函數:每一行都有一個返回值,但可以有多個變量。

多行函數:多行有一個返回值。

單行函數的分類:

字符操作函數

數字操作函數

日期操作函數

數據類型轉換函數

綜合數據類型函數

字符操作函數:
大小寫操作函數

Lower,upper,initcap   小寫大寫首字母大寫

字符串操作函數
Concat,length,substr,instr,trim,replace,lpad,rpad
實驗12:操作字符串的函數
字符操作函數:

大小寫操作函數

Lower,upper,initcap   小寫大寫首字母大寫

字符串操作函數

Concat,length,substr,instr,trim,replace,lpad,rpad

該實驗的目的是掌握常用的字符串操作的函數.

字符串的大小寫操作

SQL> Select lower(ename),upper(ename),initcap(ename) from emp;
SQL>Select lower(ename) 小寫字母,upper(ename) 大寫字母,initcap(ename) 首字母大寫 from emp;

SQL> select lower(' mf TR') 小寫字母, upper('mf TR') 大寫字母, initcap('mf TR') 首字母大寫 from dual;

Dual是虛表,讓我們用表的形式來訪問函數的值。

字符串操作函數

Concat,length,substr,instr,trim,replace,lpad,rpad

其它字符串操作函數

concat將兩個字符連接到一起
select ename,job,concat(ename,job) from emp;

求字符串的長度

下面三句話是求字符串的長度,字符串要單引。

select length('張三') from dual;--按照字
select lengthb('張三') from dual;--按字節

select lengthc('張三') from dual;--unicode的長度

substr截取字符串

substr(字符串,m,n),m是從第幾個字符開始,如果爲負的意思是從後邊的第幾個開始。N是數多少個,如果不說就是一直到字符串的結尾

SQL> select ename,substr(ename,1,1) "第一個字母",substr(ename,-2) "最後兩個字母"from emp;

求子串在父串中的位置0表示沒有在父串中找到該子串。
SQL> select ename,instr(ename,'A') "A在第幾位" from emp;

trim截斷字符串和添加字符串的函數
Trim函數是截掉頭或者尾連續的字符,一般我們的用途是去掉空格。
SQL> select trim(leading 'a' from 'aaabababaaa') from dual;
截掉連續的前置的a

SQL> select trim(trailing 'a' from 'aaabababaaa') from dual;
截掉連續的後置的a

SQL> select trim(both 'a' from 'aaabababaaa') from dual;
截掉連續的前置和後置的a

SQL> select trim('a' from 'aaabababaaa') from dual;
如果不說明是前置還是後置就是both全截斷。

Lpadrpad字符填充

SQL> select lpad(ename,20,'*') ename,rpad(ename,20,'') ename from emp;

左填充和右填充,20是總共填充到多少位,*和。是要填充的字符串。

Lpad左填充,rpad右填充,一般的用途是美化輸出的結果。

如果位數不足,按照截取後的結果顯示,不報錯。
select lpad(sal,18,'*')左填充18位星號,rpad(sal,25,'')右填充25位句號,sal from emp;

select lpad(sal,30,' ')左填充30位空格,rpad(sal,30,' ')右填充30位空格,sal from emp;

REPLACE替換字符

SQL> SELECT REPLACE('JACK and JUE','J','xj_') FROM DUAL;

將字符串中的J全部替換位xj_

實驗13:操作數字的函數

該實驗的目的是掌握常用的關於數字操作的函數.

 ROUNDTRUNC數字操作函數

以小數點位核心,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;

ceil取整,上進位,和trunc全部去掉正好相反
SQL> select ceil(45.001) from dual;

取絕對值
SQL> select abs(-23.00) from dual;

取餘數
SQL> select mod(8.88,2) from dual;

實驗14:操作日期的函數

該實驗的目的是掌握常用的關於日期操作的函數.

系統日期的操作

日期是很特殊的數據類型,用好了可以提高數據庫的性能,而使用不當往往是錯誤的根源,如果你使用字符型數據來存儲日期,就放棄日期特有的計算功能。

函數SYSDATE求當前數據庫的時間。

SQL> select sysdate from dual;

日期的顯示格式和客戶端的配置相關。

查看當前的日期顯示格式

SQL> select * from nls_session_parameters

where parameter='NLS_DATE_FORMAT';

col value for a20

代表的含義是凡是列的名稱是value的,都按照20個寬度來顯示,你想取消該列的定義

col value clear,其中colcolumn的縮寫。你想查看幫助help column即可

alter session set NLS_DATE_FORMAT='yyyy/mm/dd:hh24:mi:ss';

重新設定爲我們想要的格式。

select sysdate from dual;
SYSDATE
-------------------
2012/5/16007/05/01:16:32:54

查看系統時間,數據庫本身沒有時間,它有scn號,和我們的時間不同。

alter session set NLS_DATE_FORMAT='DD-MON-RR';

設定爲默認的顯示格式

select sysdate from dual;

再次查看,我們發現日期的顯示隨着客戶端的格式變化而變化。

日期的內部存儲都是以yyyymmddhh24miss存在數據庫中

日期的操作函數
SQL> select round(sysdate-hiredate) days,sysdate,hiredate from emp;

兩個日期相減的結果單位爲天,往往是帶小數點。我們通過函數可以取整。

取兩個日期的月間隔

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;

當前的日期算起,下一個星期五是哪一天,這句話你可能運行失敗,因爲日期和客戶端的字符集設置有關係,如果你是英文的客戶端,就的用Friday來表達,日期是格式和字符集敏感的。如果你是中文的客戶端,就的用‘星期五’來表達。

該日期的月底是哪一天。

日期的進位和截取
select hiredate,round(hiredate,'mm') ,round(hiredate,'month') from emp;

select hiredate,round(hiredate,'yyyy') ,round(hiredate,'year') from emp;

select hiredate,trunc(hiredate,'mm') ,trunc(hiredate,'month') from emp;

select hiredate,trunc(hiredate,'yyyy') ,trunc(hiredate,'year') from emp;

數字的進位和截取是以小數點爲中心,我們取小數點前或後的值,而日期的進位和截取是以年,月,日,時,分,秒爲中心。

數據類型的隱式轉換

字符串可以轉化爲數字和日期。

數字要合法,日期要格式匹配。

select ename,empno from emp where empno='7900';

數字和日期在賦值的時候也可以轉爲字符串,但在表達式的時候不可以轉換。

select ename,empno from emp where ename='123';
select ename,empno from emp where ename=123;
數據類型的顯式轉換
To_char,to_date,to_number
日期轉化爲字符串,請說明字符串的格式。

SQL> select ename,to_char(hiredate,'yyyy/mm/dd') from emp;

FM消除前置的零和空格。

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,.

col salary for a30

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函數。

SQL> select to_char(321,'xxxxx') from dual;

其中xxxxx的位數要足夠,不然報錯,你就多寫幾個,足夠大就可以。

數據類型的顯式轉換
 To_number,to_date

如果你想將十六進制的數轉換爲十進制的數請使用to_number函數。

SQL> select to_number('abc32','xxxxxxxx') from dual;

日期是格式和語言敏感的,切記!

SQL> select TO_NUMBER('100.00', '9G999D99') from dual;

G爲千分符,D爲小數點

RRyy日期數據類型

select to_char(sysdate,'yyyy') "當前",

to_char(to_date('98','yy'),'yyyy') "yy98",
to_char(to_date('08','yy'),'yyyy') "yy08",
to_char(to_date('98','rr'),'yyyy') "rr98",
to_char(to_date('08','rr'),'yyyy') "rr08" from dual;

結果爲

yy是兩位來表示年,世紀永遠和說話者的當前世紀相同。

RR比較靈活,它將世紀分爲上半世紀和下半世紀。如果你處於上半世紀,描述的是0-49,那麼就和當前世紀相同,描述的是50-99就是上世紀。如果你處於下半世紀,描述的是0-49,那麼是下個世紀,描述的是50-99就是當前世紀。從而可以看出,RR的設計完全爲了1990年到2010之間我們的思維習慣而設計的。當我們時間到2050前後,使用起來就非常的彆扭。

實驗15:操作數據爲null的函數

該實驗的目的是掌握常用的關於NULL值操作的函數.

綜合數據類型函數
NVL (expr1, expr2)

如果expr1爲非空,就返回expr1, 如果expr1爲空返回expr2,兩個表達式的數據類型一定要相同。

NVL2 (expr1, expr2, expr3)

如果expr1爲非空,就返回expr2, 如果expr1爲空返回expr3

NULLIF (expr1, expr2)

如果expr1 expr2相同就返回空,否則返回expr1

COALESCE (expr1, expr2, ..., exprn)

返回括號內第一個非空的值。

SQL> select ename,comm,nvl(comm,0) from emp;

有獎金就返回獎金,獎金爲空就返回0

select ename 姓名,sal 工資,comm 獎金,sal+nvl(comm,0) 總工資,nvl2(comm,'工資加獎金','純工資') "收入類別" from emp;

有獎金就返回‘工資加獎金‘,獎金爲空就返回‘純工資’。

SQL> select ename,nullif(ename,'KING') from emp;
如果員工的名稱爲king就返回空,否則返回自己的名字。

SQL> select ename 姓名,COALESCE(comm,0) "獎金" from emp;

如果有獎金就返回獎金,如果沒有獎金就返回0,起個別名叫做"獎金"

實驗16:分支的函數

該實驗的目的是掌握分支操作的函數.

Case語句

9I以後才支持的新特性,說叫語句其實是函數。目的是爲了分支。

CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
例子:

例題:判別job,不同工作的人賦予不同的工資,除了CLERKSALESMANANALYST以外,其它的人工資不變,將函數的值起一個別名爲"處理後數據"

語句:
SELECT ename, job, sal,
CASE job WHEN 'CLERK' THEN 1.1111*sal
WHEN 'SALESMAN' THEN 2.2222*sal
WHEN 'ANALYST' THEN 3.3333*sal

ELSE sal END "處理後數據"

FROM emp;

Decode函數:

CASE語句一樣都是分支語句,但Decode函數是ORACLE自己定義的,其它數據庫可能不支持。

語法如下:

DECODE(col|expression, search1, result1
[, search2, result2,...,]
[, default])

例題:判別job,不同工作的人賦予不同的工資,除了CLERKSALESMANANALYST以外,其它的人工資不變,將函數的值起一個別名爲"處理後數據"

語句:
SELECT ename, job, sal,
decode(job ,'CLERK' , 1.11*sal
,'SALESMAN' , 3.33*sal
,'ANALYST' , 8.88*sal

, sal ) "處理後數據"

FROM emp;

下面的例題是求稅率:

不同工資上的稅率不同。每2000一個臺階,8000以上一律40%的稅。

SQL>SELECT ename, sal,
DECODE (TRUNC(sal/1000, 0),
0, 0.00,
1, 0.09,
2, 0.20,
3, 0.30
, 0.40
) 稅率
FROM emp;

不管CASE語句還是DECODE函數,他們都是單行函數,每一行都有一個返回值。從ORACLE角度來講,DECODE更好,因爲各個版本的數據庫都支持,橫向來說,CASE語句更好,因爲它是國標,不同的數據庫間都認可。
實驗17:分組統計函數

該實驗的目的是掌握常用的組函數.理解group by的操作.

需要掌握的知識點:

1。組函數

2。分組統計

3NULL值在組函數中的作用

4HAVING的過濾作用

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",

sum(decode(to_char(hiredate,'yyyy'),'1981',1,0)) "1981",
sum(decode(to_char(hiredate,'yyyy'),'1982',1,0)) "1982",
sum(decode(to_char(hiredate,'yyyy'),'1987',1,0)) "1987",
count(ename) "總人數" from emp;

《完》

--xjzhujunjie

--2012/05/17

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章