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命令;執行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’) (只有$符號可以) |
$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;