Oracle數據庫(一)


Oracle 是一個數據庫管理系統,是Oracle公司的核心產品。其在數據安全性與安整性控制方面的優越性能,以及跨操作系統、跨硬件平台的數據操作能力。基於“客戶端/服務         器”(Client/Server)系統結構。

主要特點:

1.支持多用戶、大事務量的事務處理。

2.在保持數據安全性和完整性方面性能優越。

3.支持分布式數據處理。將公布在不同物理位置的數據庫用通信網絡連接起來,組成一個邏輯上統一的數據庫,完成

數據處理任務。

4.具有可移植性。Oracle可以在Windows、Linux等多個操作系統平台上使用。

 

Oracle基本概念:

1.數據庫。這里的數據庫是磁盤上存儲數據的集合,在物理上表現為數據文件、日志文件和控制文件等。在邏輯上以表空

間形式存在。必須首先創建數據庫,然后才能用Oracle。可以在Database Configuation Assistant上創建。

2.全局數據庫名。用於區分一個數據庫的標識。它由數據庫名稱和域名構成,類似網絡中的域名,使數據庫的命名在整個

網絡環境中唯一。

3.數據庫實例。每個啟動的數據庫都對應一個數據庫實例,由這個實例來訪問數據庫中的數據。

4.表空間。每個數據庫都是由若干個表空間構成的,用戶在數據庫中建立的所有內容都被存儲到表空間中。一個表空間可

以由多個數據文件組成,但一個數據文件只能屬於一個表空間。

5.數據文件。擴展名是.dbf,是用於存儲數據庫數據的文件。一個數據文件中可能存儲很多個表的數據,而一個表的數據

也可以存放在多個數據文件中。數據文件和數據庫表不存在一對一的關系。

6.控制文件。技展名.ctl,是一個二進制文件。控制文件是數據庫啟動及運行所必需的文件。存儲數據文件和日志文件的

名稱和位置。Oracle 11g默認包含三個控制文件。

7.日志文件。擴展名.log,它記錄了數據的所有更改信息,並提供了一種數據恢復機制,確保在系統崩潰或其他意外出現

后重新恢復數據庫。在工作過程中,多個日志文件組之間循環使用。

8.模式和模式對象。模式是數據庫對象(表、索引等,也稱模式對象)的集合。

 

Windows下Oracle數據庫服務:

1.OracleServiceSID服務是Oracle數據庫服務。此服務對應名為SID(系統標識符)的數據庫實例創建的。必須啟動。

2.OracleOraDb11g_homelTNSListener服務是監聽器服務。要遠程連接數據庫服務器,必須連接監聽進程,該服務只有

在數據庫需要遠程訪問時候才需要。(PL/SQL等第三方工具連接就相當於遠程連接)。

3.OracleDBConsoleSID服務是數據庫控制台服務,是采用瀏覽器方式打開的,用於使用Oracle企業管理器的程序。如

果進入 基於Web形式的企業管理(EM)控制平台,必須要啟動OracleDBConsoleSID服務。

 

連接數據庫:

Sys和System用戶都是Oracle的系統用戶,Scott用戶是Oracle數據庫的一個測試賬戶,里男包含一些測試例表。每

個用戶下所有的對象稱為模式對象。

1.用SQL Plus工具登錄:

1)cmd->sqlplus->用戶名:->密碼:

2)直接打開程序SQL Plus->用戶名:->密碼

3)在輸入用戶名處->用戶名/密碼@網絡服務名

4)命令窗口:sqlplus /nolog 這樣就只是打開了sqlplus而並沒有連接數據庫,之后要連接數據庫得繼續敲:

connect 用戶名/密碼@數據庫名;

2.PL/SQL Developer工具:

1)用戶名:輸入System.

2)口令:輸入對應密碼。

3)數據庫:輸入已經配置好的網絡服務名,如orclDB。

4)連接為:Normal普通用戶;sysOper數據庫操作員;sysDBA數據庫管理員。

3.Java連接Oracle:

driver: oracle.jdbc.driver.OracleDriver

url: jdbc:oracle:thin:@localhost:1521:數據庫名

 

DUAL偽表,在Oracle的查詢語句中select和from關鍵字一定有值,但在某些情況下不需要from,如查詢常量或函數,為

了滿足要求,Oracle使用DUAL偽表來實現要求。

如: select sysdate from dual;--查詢出當前系統日期和時間

 

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 <condition>];

復制表結構和記錄:

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命令;執行DDLDCL語句后,當前事務自動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’) (只有$符號可以)

$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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM