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

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

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

使用函數的目的是爲了操做數據express

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

變量能夠有好多。ide

傳入的變量能夠是列的值,也能夠是表達式。函數

函數能夠嵌套。性能

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

單行函數:每一行都有一個返回值,但能夠有多個變量。設計

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

單行函數的分類:

字符操做函數unicode

數字操做函數

日期操做函數

數據類型轉換函數

綜合數據類型函數

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

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

相關文章
相關標籤/搜索