1. 程式人生 > >oracle(一)

oracle(一)

Oracle資料型別:

1.字元資料型別:

1)char資料型別。當需要固定長度字串時,使用char。長度1~2000位元組。如果沒有指定大小,預設1位元組。如果

使用者輸入的值小於指定的大小,系統用空格填充。如果大於,報錯。

2)varchar2資料型別,支援可變長度的字串。大小為1~4000位元組。如果使用者輸入的值小於指定的大小,不用填充

,varchar2資料型別可以節省磁碟空間。如果varchar2想根據定義的長度儲存相應的漢字個數,可以宣告為

如:varchar2(10 char)

3)nchar資料型別,即國家字符集,使用方法和char相同。用來儲存Unicode字符集型別,即雙位元組字元資料。最

小單位1字元。

4)nvarchar2與nchar類似,只是可變長度的。

2.數值資料型別number:

number資料型別可以儲存正數、負數、零、定點數、精度為38信的浮點數。

語法:number(p,s) --如果不寫p,s內容,是否是沒有限制?

p 為精度,表示數字的有效位數,在1~38之間,從左邊第一個不為0的數算起,小數點和負號不計入有效位數。

s 為範圍,表示小數右邊數字的位數,在-84~+127之間。

規則:首先精確到小數中右邊s位,並四捨五入。如果精確後值的有效位數<=p,則正確;否則報錯。

3.日期時間資料型別:用於儲存日期值和時間值

1)date資料型別,用於儲存表中的日期和時間資料。使用7位元組固定長度,每個位元組分別儲存世紀、年、月、日、小

時、分和秒。sysdate函式的功能是返回當前的日期和時間。

2)timestamp資料型別,用於儲存日期的年、月、日以及時間的小時、分和秒。秒值精確到小數小後6位,包含時區

資訊。systimestamp函式的功能是返回當前日期、時間和時區。

改變日期格式:

Oracle中的SQL視窗:alter session set nls date format=’YYYY-MM-DD HH24:MI:SS’;//只對當前視窗有效。

環境變數:鍵:nls_date_format

值:YYYY-MM-DD HH24:MISS

4.遊標型別,SYS_REFCURSOR型別是Oracle提供的系統遊標型別。

如下,過程返回一個遊標型別:

CREATE OR REPLACE PROCEDURE get_sals(

cur_salary OUT SYS_REFCURSOR

)

IS

BEGIN

OPEN our_salary FOR

SELECT empno, sal FROM employee;

END;

LOB資料型別:

LOB又稱為“大物件”資料型別。我叫儲存4GB的非結構化資訊,如聲音剪輯和視訊剪輯。LOB允許對資料進行高效、隨

機、分段的訪問。一個表中可以有多個列被定義為LOB資料型別。可以通過PL/SQL中提供的程式包DBMS_LOB修改。

1.CLOB(Character LOB,字元LOB)儲存大量字元資料。可以儲存單位元組字元資料和多位元組字元資料,主要用於儲存非結

構化的XML多檔。如新聞、內容介紹等含大量文字內容的文件。

2.BLOB(Binary LOB,二進位制LOB)可以儲存較大的二進位制物件,如圖形、視訊剪輯和聲音剪輯等。

3.BFILE(Binary File,二進位制檔案)能夠將二進位制檔案儲存在資料庫外部的作業系統檔案中。BFILE列儲存一個BFILE

定位器,指向位於伺服器檔案系統上的二進位制檔案。最大4GB。

4.NCLOB資料型別用於儲存大的nchar字元資料。支援固定寬度字元和可變寬度字元(Unicode字元資料)。使用方法同

CLOB類似。

早期使用Long資料型別儲存大資料。

Oracle中的偽列:

1.rouid,資料庫中每一行都有一個行地址,rowid偽列返回該行地址。rowId值可以唯一標識資料庫中的一行。

2.rounum,返回一個數值代表行的次序。通過使用rownum,使用者可以限制查詢返回的行數。

rownum對於等於某值的查詢條件,可以使用rownum=1作為條件,但是不能等於大於1的值。

rownum對於大於某值的查詢條件,可以使用rownum>1,但是不能大於1以上的值。

rownum對於小於某值的查詢條件,可以rownum<大於1的整數。

例: select * from(

select a.*,rownum rn from ( --這裡設定了rownum的列別名,這樣就可以在外層查詢用between and語句了

 select * from employee order by sal desc

) a

)

where rn between 5 and 9;

SQL語言分類:

資料定義語言(DDL Data Definition):create建立、alter更改、truncate截斷、drop刪除

資料操縱語言(DML Data Manipulation Language):insert插入、select選擇、delete刪除、update更新

事務控制語言(TCL Transaction Control Language):commit提交、savepoint儲存點、rollback回滾

資料控制語言(DCL Data Control Language):grant授予、revoke回收

資料定義語言DDL:

1.create table命令:

create table [schema.]table_name

(

column_name datatype,

column_name datetype,

)

schema表示物件的所有者,即模式的名稱。如果使用者在自己的模式中建立表,則可以不指定所有者名稱。

table表示表的名稱。

column表示列的名稱。

datatype表示該列的資料型別及其寬度。

表名命名規則:

1)表名首字元應該為字母。

2)不能使用Oracle保留字來為表命名。

3)表各的最大長度為30個字元。

4)同一使用者模式下的不同表不能具有相同的名稱。

5)可以使用下劃線、數字、字母,但不能使用空格和單引號。

Oracel和SQL Server資料庫物件表之間的差異:

列數:Oracle,254; SQL Server,1024

行大小:Oracle沒有限制;SQL Server,8060位元組,加16位元組指向每個text或image列。

最大行數:Oracle沒有限制;SQL Server沒有限制

表命名規則:Oracle,[schema.]table_name; SQL Server,[[[server.]database.]owner.]table_name

2.truncate table命令:

可以只刪除表中的記錄而不刪除表結構,刪除表中的所有行而不記錄日誌。

truncate table <table_name>;

資料操縱語言DML:(insert,select,update,delete)

1.選擇無重複的行,在select命令中包含distinct子句。

select distinct stuName,stuAge from stuInfo;

2.使用列別名,列別名不會影響列的實際名稱。列別名位於列表達式後面。

select stuName as “姓 名”,stuAge as 年齡,stuNo 編號 from stuInfo;

如果列別名中指定有特殊字元(如空格)的列標題使用雙引號括起來。

3.利用現有表建立新表。

語法: create table <newTable_name>

as

select {* | column(s)} from <oldTable_name> [where ];

複製表結構和記錄:

create table newStuInfo

as

select * from stuInfo;

複製表指定列和記錄:

create table newStuInfo

as

select stuName,stuAge,stuNo from stuInfo;

只複製表結構:

create table newStuInfo

as

select * from stuInfo where 1=2;

4.查看錶中行數:

select count(1) from stuInfo; --1比*號效率較高

5.取出stuName,stuAge列不存在重複的資料記錄:

select stuName,stuAge from stuInfo

group by stuName,stuAge

having(count(stuName||stuAge));//“||”在這裡是連線操作符,類似於“+”,意思為將兩部分內容連線在

一起,因為count()裡面只能有一個列,所以連線起來。

6.刪除stuName、stuAge列重複的行(相同資料只保留一行)

delete from stuInfo where rowid not in(

select max(rowid) from stuInfo group by stuName,stuAge

having (count(stuName||stuAGe)>1)

union

select max(rowid) from stuInfo group by stuName,stuAge

having (count(stuName||stuAge)=1)

);

7.根據當前使用者所有資料量>100萬的表的資訊

select tabke_name from user_all_tables a where a.num_rows>1000000;

–user_all_tables為系統提供的資料檢視,使用者可以通過查詢該檢視獲得當前使用者表中描述。

事務控制語言TCL:

1)commit:提交事務,提事務中對資料庫的修改進行永久儲存。

2)rollback:回滾事務,即取消對資料庫所做的作何修改。

3)savepoint <savepoint_name>:在事務中建立儲存點。

4)rollback to savepoint <savepoint_name>:將事務回滾到儲存點。即savepoint 建立的儲存點

開啟事務:在Oracle中,上一次事務結束以後,資料第一次被修改時自動開啟。

結束事務: ①資料被提交:發出commit命令;執行DDL或DCL語句後,當前事務自動commit;與Oracle分離。

②資料被撤銷:發出rollback命令;伺服器程序異常結束;DBA停止會話。

例: insert into dept values (10,’ACCOUNTING’,’NEW YORK’);

commit;

savepoint a;//a只是一個名稱

insert into dept values (20,’SALES’,’NEW YORK’);

rollback to savepoint a;

rollback;–結果只有第一條記錄插入成功

資料控制語言DCL:

資料控制語言為使用者提供許可權控制命令。資料庫物件(如表)的所有者對這些物件擁有控制權限。所有者可以根據自己

的意願決定其他使用者如何訪問物件,授予其他使用者許可權(insert,select,update,delete,…)

SQL操作符:

1.算術操作符。算術表示式由number資料型別的列名、數值常量和連線它們的算術操作符組成。

+(加)、-(減)、*(乘)、/(除)。

2.比較操作符:=、!=、<、<=、>、>=、between… and 、in、not in、like、is null、is not null。

Oracle中的between-and語句,包含前也包含後。如:rn between 5 and 9;結果是5,6,7,8,9

3.邏輯操作符:and , or , not。

4.集合操作符,將多個查詢的結果組合成一個結果集。

規則: 1)通過集合操作符連線的條個查詢具有相同的列數,且對應列的資料型別必須相容。

2)這種查詢不應含有long型別的列。列標題來自第一個select語句。

union (並集)操作符返回兩個查詢選定的所有不重複的行。使用order by 子句時,必須放在最後一個select後。

select empno from employee

union

select rempno from retireEmp

order by empno;

union all (並集all)操作符合並兩個查詢選定的所有行。包括重複的行。

intersect (交集)操作符返回兩個查詢都有的行。

select empno from employee

intersect

select rempno from retireEmp;

minus (減集)操作符只返回由第一個查詢選定而未被第二個查詢選定的行,即在第一個查詢結果中排除在第二個查詢

結果中出現的行。

select empno from employee

minus

select rempno from retireEmp;

5.連線操作符(||),用於將兩個或多個字串合併成一個字串,或者將一個字串與一個數值合併在一起。

select job||’ ‘||ename from employee;–輸出的時候將崗位和姓名連線在一起輸出。

SQL函式:大致分為單行函式、聚合函式、分析函式。

單行函式:字元函式、日期函式、數字函式、轉換函式及其他函式。

聚合函式(Aggregate Function)也稱為分組函式是基於資料庫表的多行進行運算,返回一個結果。

分析函式是對一個查詢結果中的每個分組進行運算,但每個分組對應的結果可以有多個。

字元函式:操作結果可能是字元資料型別,也可能是數字型別。

函式

說明

輸入

結果

initcap(char)

首字母大寫

initcap(‘hello’)

Hello

lower(char)

轉換為小寫

lower(‘FUN’)

fun

upper(char)

轉換為大寫

upper(‘sun’)

SUN

ltrim(char,set)

左剪裁

ltrim(‘xyzadams’,’xyz’)

zdams

rtrim(char,set)

右剪裁

rtaim(‘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)

取子字串,下標從1開始

substr(‘abcdefg’,3,2)

cd

concat(char1,char2)

連線字串

concat(‘Hello’,’world’)

Helloworld

數字函式,接受數字輸入並返回數字作為輸出結果,返回的值可以精確到小數點後38位。

函式

說明

輸入

結果

abs(n)

取絕對值

abs(-15)

15

ceil(n)

向上取整

ceil(44.178)

45

floor(n)

向下取整

floor(44.99)

44

round(m,n)

四捨五入

round(100.256,2)

100.26

trunc(m,n)

截斷

trunk(100.256,2)

100.25(小數後幾位?)

sin(n)

正弦

sin(1.571)

.999999979

cos(n)

餘弦

cos(0)

1

power(m,n)

m的n次冪

power(4,2)

16

sqrt(n)

平方根

sqrt(4)

2

sign(n)

取符號

sign(-32)

-1

mod(m,n)

取m%n的結果

mod(10,3)

1 (Oracle中沒有%運算子)

日期函式,對日期值進行運算,根據函式的用途產生日期資料型別或數值型別的結果。

函式

功能

例項

結果

sysdate

返回當前日期和時間

select sysdate from dual;

當前日期和時間

systimestamp

返回當前日期、時間、時區

select systimestamp from

dual;

當前日期、時間

和時區

months_between(

prevdate,nextdate)

返回兩個日期間的月份

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月-3’,’星期一’)

10-2月03

last_day

返回指定日期所在月的最後一天

last_day(‘06-2月-03’)

28-2月-03

round

按指定格式對日期進行四捨五入

對年份四捨五入,日期>6月30日,則

年份+1;

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

extract(year

from date)

返回date中的年份,也可以是month

day,

extract(year from sysdate)

2014

轉換函式,將值從一種資料型別轉換為另一種資料型別。Oracle中沒有convert函式。

函式

功能

例項

結果

to_char

轉換成指定字串型別

to_char(123.45,’ 9999.9 ) ( 9999.9’) (只有 符號可以)

$123.5

to_date

轉換成指定日期型別

to_date(‘1980-01-01’,’yyyy-mm-dd’)

01-1月-80

to_number

轉換成指定數值型別

to_number(‘1234.5’)

數字:1234.5

to_char()的語法為:

to_char(d|n[,fmt]);–其中d是日期,n是數字,fmt是指定日期或數字的格式 。轉換成的是varchar2資料型別

例: select to_char(sysdate,’YYYY”年”fmMM”月”fmDD”日” HH24:MI:SS’) from dual;

–使用了填充模式”fm”格式掩碼來避免空格填充和數字零填充

–格式中的小數有多少位,結果就會四捨五入進多少位。

to_date()的語法為:

to_date(char[,fmt]);–將char或varchar資料型別轉換為日期資料型別。fmt指定字元的形式。

–這裡的fmt是指定Oracle伺服器該如果解析這個char字串的格式,返回的結果統一是:yyyy-mm-dd;

select to_date(‘2013-07-18’,’yyyy-mm-dd’) from dual;–結果:18-7月-13

–這Oracle中mm是月份,mi是分種數

to_number()函式將包含數字的字串轉換為number資料型別。通常不必這樣做,因為Oracle可以對數字字串進行隱

式轉換。

select sqrt(to_number(‘100’)) from dual;–結果:10

其他函式,除去已介紹函式還不其他一些單行函式,在此稱為其他函式。

函式

功能

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的值

例: select ename,

   sal+nvl(comm,0) sal1,

   nvl2(comm,sal+comm,sal) sal2,

   decode(to_char(hiredate,'MM'),'01','一月','02','二月','03','三月','04','四月','05'

                           ,'五月','06','六月','下半年') mon

from employee;

聚合函式:能基於列進行計算,將多個直合併為一個值。對一組值進行計算,並返回計算後的值。

使用聚合函式進行統計值時,將忽略NULL值,但不忽略重複項。

1.sun(),返回表示式中所有數值的總和,只能用於數字列,只能返回一個數值,不能夠直接與可能返回多行的列一起 使用來進行查詢。

例:select sun(score) from result where studentid=33 --查詢學號為33的學生的成績總和

2.avg(),返回表示式中所有數值的平均值,只能用於數值列。

例:select avg(score) from result where score>=60 --查詢及格的平均值。

3.max()和min():max()返回表示式中的最大值,min()返回表示式中的最小值,它們都可以用於數字型,字元型以及 日期/時間型別的列。

例:select avg(score),max(score),min(score) from result where score>=60

–查詢及格線上的平均分、最高分、最低分

4.count(),返回提供的組成或記錄齡中的計數。可以用於數字和字元型別的列,也可以使用星號’*’作為count()的 表示式。

例:select count(*) from score where score>=60 --查詢及格人數的語句

也可以使用整數型別的值當作表示式,如:

select count(1000) from score where score>=60 --結果將和上面的一樣

小提示:count(distinct 表示式),遇到重複資料,只記錄一次

分析函式:Oracle從8.1.6版本開始提供分析函式。分析函式是對一組查詢結果進行運算,然後獲行結果。與聚合函式的區別在於返回多行,聚合函式每組返回一行。用於對分組後組內進行排序。

語法:

函式名([引數]) over ([分割槽子句][排序子句]);–分割槽子句(partition by)表示將查詢結果分為不同的組,功能

類似於group by語句。預設將所有結果作為一個分組。排序子句(order by)預設是asc升序。

rank、dense_rank、row_number函式用於為每條記錄產生一個從1開始至N的自然數,N的值可能小於記錄的總數。這

3個函式用於解決排名問題。

1)row_number函式返回一個唯一的值,當遇到相同資料時,排名按照記錄集中記錄的順序依次遞增。

2)dense_rank函式返回一個唯一的值,當遇到相同資料時,所有相同資料的排名都是一樣的。

3)rank函式返回一個唯一的值,當遇到相同的資料時,所有相同資料的排名是一樣的,同時會在最後一條相同記錄和

下一條不同記錄的排名之間空出排名。

例:select ename,deptno,sal,

   rank() over (partition by deptno order by sal desc) rank,

   dense_rank() over (partition by deptno order by sal desc) "dense_rank",

   row_number() over (partition by deptno order by sal desc) "row_number"

from employee;