第一章、Oracle基礎

Oracle簡介

Oracle數據庫是Oracle(甲骨文)公司的核心產品,適合于大型項目的開發;銀行、電信、電商、金融等各領域都大量使用Oracle數據庫。

Oracle數據庫是一種對象關系型數據庫,在關系型數據庫的基礎上,引入了一些面向對象的特性。

Oracle基礎概念(實例、表空間、用戶、表之間關系)

數據庫

數據庫是數據集合。Oracle是一種數據庫管理系統,是一種關系型的數據庫管理系統。

實例

一個Oracle實例(Oracle Instance)有一系列的后臺進程和內存結構組成。一個數據庫可以有n個實例。

用戶

用戶是在實例下建立的。不同實例可以建相同名字的用戶。

Oracle數據庫建好后,要想在數據庫里建表,必須先為數據庫建立用戶,并為用戶指定表空間。

表空間

表空間是一個用來管理數據存儲邏輯概念,表空間只是和數據文件(ORA或者DBF文件)發生關系,數據文件是物理的,一個表空間可以包含多個數據文件,而一個數據文件只能隸屬一個表空間。

數據文件(dbf、ora)

數據文件是數據庫的物理存儲單位。數據庫的數據是存儲在表空間中的,真正是在某一個或者多個數據文件中。而一個表空間可以由一個或多個數據文件組成,一個數據文件只能屬于一個表空間。一旦數據文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數據文件,只能刪除其所屬于的表空間才行。

理解:表的數據,是有用戶放入某一個表空間的,而這個表空間會隨機把這些表數據放到一個或者多個數據文件中。

由于oracle的數據庫不是普通的概念,oracle是由用戶和表空間對數據進行管理和存放的。但是表不是由表空間去查詢的,而是由用戶去查的。因為不同用戶可以在同一個表空間建立同一個名字的表!這里區分就是用戶了!

Oracle關系圖

Oracle數據庫可以創建多個實例,每個實例可以創建多個表空間,每個表空間下可以創建多個用戶和數據庫文件,用戶可以創建多個表。

解釋:一個表空間(數據庫)包含一個或多個數據文件,數據文件通常為*.dbf格式,一個數據庫的數據文件包含全部數據庫數據(如表、索引等)。

一個用戶可以使用一個或多個表空間,一個表空間也可以供多個用戶使用。用戶和表空間沒有隸屬關系,表空間是一個用來管理數據存儲的邏輯概念,表空間只是和數據文件發生關系,數據文件是物理的,一個表空間可以包含多個數據文件,而一個數據文件只能隸屬一個表空間。

總結:解釋數據庫、表空間、數據文件、表、數據的最好辦法就是想象一個裝滿東西的柜子。數據庫其實就是柜子,柜中的抽屜是表空間,抽屜中的文件夾是數據文件,文件夾中的紙是表,寫在紙上的信息就是數據。

SQLPlus常用語句

? 顯示當前用戶名

SQL>show user;

? 查看當前用戶的角色

SQL>select * from user_role_privs;

? 查看當前用戶的系統權限和表級權限

SQL>select * from user_sys_privs;

SQL>select * from user_tab_privs;

? 查看用戶所有表

SQL>select * from all_tab_comments -- 查詢所有用戶的表,視圖等。

SQL>select * from user_tab_comments -- 查詢本用戶的表,視圖等。

SQL>select * from all_col_comments? --查詢所有用戶的表的列名和注釋。

SQL>select * from user_col_comments -- 查詢本用戶的表的列名和注釋。

SQL>select * from all_tab_columns --查詢所有用戶的表的列名等信息。

SQL>select * from user_tab_columns --查詢本用戶的表的列名等信息。

? 關閉數據庫

SQL>shutdown immediate;

? 啟動數據庫

SQL>startup open;

? 創建表空間(數據庫)

SQL>create tablespace //表空間名稱

datafile 'E:\路徑\文件名.dbf' //表空間數據文件路徑

size 100M //表空間初始大小

? 刪除表空間

SQL>drop tablespace 數據庫名;

? 修改表空間:添加文件

SQL>alter tablespace 數據庫;

add datafile'E:/Oracle/文件名.dbf' //添加文件

size 10M; 文件大小

? 修改表空間:刪除文件

SQL>alter tablespace //數據庫

drop datafile'E:/Oracle/文件名.dbf'; //刪除文件

? 顯示當前連接用戶

SQL>show user

? 查看系統擁有哪些用戶

SQL>select * from all_users;

? 連接到新用戶

SQL>conn

? 查看oracle的版本信息

SQL>select * from v$version;

? 查詢當前用戶下所有對象

SQL>select * from tab;

? 查詢表結構

SQL>desc 表名;

? 回滾

SQL>roll;

SQL>rollback;

? 提交

SQL>commit;

? 退出

SQL>exit;

SQL>quit;

? 設置顯示效果

SQL>set linesize 300;

SQL>set pagesize 300;

SQL>col 列名 for a列寬;

Oracle數據類型

Oracle創建用戶、角色、授權、建表

oracle用戶的概念對于Oracle數據庫至關重要,在現實環境當中一個服務器一般只會安裝一個Oracle實例,一個Oracle用戶代表著一個用戶群,他們通過該用戶登錄數據庫,進行數據庫對象的創建、查詢等開發。

每一個用戶對應著該用戶下的N多對象,因此,在實際項目開發過程中,不同的項目組使用不同的Oracle用戶進行開發,不相互干擾。也可以理解為一個Oracle用戶既是一個業務模塊,這些用戶群構成一個完整的業務系統,不同模塊間的關聯可以通過Oracle用戶的權限來控制,來獲取其它業務模塊的數據和操作其它業務模塊的某些對象。

用戶權限

Oracle數據庫用戶權限分為:系統權限和對象權限兩種。

系統權限:比如:create session可以和數據庫進行連接權限、create table、create view 等具有創建數據庫對象權限。

對象權限:比如:對表中數據進行增刪改查操作,擁有數據庫對象權限的用戶可以對所擁有的對象進行相應的操作。

一、創建新用戶

create user student--用戶名

? identified by "123456"--密碼

? default tablespace USERS--表空間名

? temporary tablespace temp --臨時表空間名

? profile DEFAULT --數據文件(默認數據文件)

? account unlock; -- 賬戶是否解鎖(lock:鎖定、unlock解鎖)

更改用戶:

alter user STUDENT

? identified by 123456? --修改密碼

? account lock;--修改用戶處于鎖定狀態或者解鎖狀態 (LOCK|UNLOCK )

二、刪除用戶

語法:

? ? drop user 用戶名;

例子:

? ? drop user test;

若用戶擁有對象,則不能直接刪除,否則將返回一個錯誤值。

指定關鍵字cascade,可刪除用戶所有的對象,然后再刪除用戶。

語法:

? ? drop user 用戶名 cascade;

例子:

? ? drop user test cascade;

三、授權角色

角色是一組權限的集合,將角色賦給一個用戶,這個用戶就擁有了這個角色中的所有權限。

三種標準角色:

1.connect(連接角色)

connect角色是Oracle用戶的基本角色,connect權限代表著用戶可以和Oracle服務器進行連接,建立session(會話)。

2.resource(資源角色)

resouce角色是開發過程中常用的角色。 RESOURCE給用戶提供了可以創建自己的對象,包括:表、視圖、序列、過程、觸發器、索引、包、類型等。

3.dba(數據庫管理員角色)

DBA角色是管理數據庫管理員該有的角色。它擁護系統了所有權限,和給其他用戶授權的權限。SYSTEM用戶就具有DBA權限。

提示:

系統權限只能通過DBA用戶授權,對象權限有擁有該對象權限的對象授權(不一定是本身對象)!用戶不能自己給自己授權!

授權命令:

--GRANT 對象權限 on 對象 TO 用戶? ?

grant select, insert, update, delete on JSQUSER to STUDENT;

--GRANT 系統權限 to 用戶

grant select any table to STUDENT;

--GRANT 角色 TO 用戶

grant connect to STUDENT;--授權connect角色

grant resource to STUDENT;--授予resource角色

撤銷權限:

-- Revoke 對象權限 on 對象 from 用戶

revoke select, insert, update, delete on JSQUSER from STUDENT;

-- Revoke 系統權限? from 用戶

revoke SELECT ANY TABLE from STUDENT;

-- Revoke 角色(role) from 用戶

revoke RESOURCE from STUDENT;

四、創建/授權/刪除角色

創建角色:

語法:

? ? create role 角色名;

例子:

? ? create role testRole;

授權角色:

語法:

? ? grant select on class to 角色名;

列子:

? grant select on class to testRole;

注:現在,擁有testRole角色的所有用戶都具有對class表的select查詢權限

刪除角色:

語法:

? ? drop role 角色名;

例子:

? ? drop role testRole;

注:與testRole角色相關的權限將從數據庫全部刪除

Oracle約束

在Oracle中,數據完整性可以使用約束、觸發器、應用程序(過程、函數)三種方法來實現,在這三種方法中,因為約束易于維護,并且具有最好的性能,所以作為維護數據完整性的首選。

添加約束語法:

ALTER? TABLE? 表名? ADD CONSTRAINT? 約束名? 約束類型? 約束描述

約束命名規范:

 非空約束     NN_表名_列名

 唯一約束     UK_表名_列名

 主鍵約束     PK_表名_列名

 外鍵約束     FK_表名_列名

 檢查約束     CK_表名_列名

 默認約束     DF_表名_列名

主鍵約束( Primary key, 簡稱 PK)

該約束的定義為:不能重復,不能為null。

SQL> alter table 表名 add constraint 約束名 primary key(字段名);

非空約束( not null , 簡稱 NN )

約束該列不能為空值。

SQL> alter table 表名 modify 字段名 not null;

唯一約束( Unique , 簡稱 UK )

約束該列數據不能重復,不能相同。

SQL> alter table 表名 add constraint 約束名 unique(字段名);

檢查約束( Check , 簡稱 CK )

檢查自定義條件是否為真,為真就可以插入,更新。

SQL> alter table 表名 add constraint 約束名 check(字段名 in('約束的值','約束的值')));

例子:

SQL> alter table emp add constraint CK_stuSex check(sex in('男','女'));

SQL>alter table 表名 add constraint 約束名 check(字段 between 0 and 100);

--出生日期在1980年1月1日之后

SQL>ALTER TABLE student ADD CONSTRAINT CK_student_borndate CHECK (borndate > TO_date(‘1980-01-01‘,‘yyyy-MM-dd‘) );

外鍵約束( Foreign key, 簡稱 FK )

? ? 外鍵約束定義在具有父子關系的子表中,外鍵約束使得子表中的列對應父表的主鍵列,用以維護數據庫的完整性。

外鍵約束注意以下幾點:

1、 外鍵約束的子表中的列和對應父表中的列數據類型必須相同,列名可以不同

2、 對應的父表列必須存在主鍵約束(PRIMARY KEY)或唯一約束(UNIQUE)

3、 外鍵約束列允許NULL值,對應的行就成了孤行了

4、 外鍵約束的表中的列數據必須包含在父表主鍵字段的數據內,否則會報錯:ORA-02298: 無法驗證- 未找到父項關鍵字

? ? 其實很多時候不使用外鍵,很多人認為會讓刪除操作比較麻煩,比如要刪除父表中的某條數據,但某個子表中又有對該條數據的引用,這時就會導致刪除失敗。我們有兩種方式來優化這種場景:

  第一種方式:簡單粗暴,刪除的時候,級聯刪除掉子表中的所有匹配行,在創建外鍵時,通過 on delete cascade 子句指定該外鍵列可級聯刪除:

SQL> alter table 表名 add constraint 約束名 foreign key(字段名) references 父表名 (父表字段) on delete cascade;

第二種方式:刪除父表中的對應行,會將對應子表中的所有匹配行的外鍵約束列置為NULL,通過 on delete set null 子句實施:

SQL> alter table 表名 add constraint 約束名 foreign key(字段名) references 父表名 (父表字段) on delete set null;

默認約束( Default Key,簡稱 DF )

約束用于向列中插入默認值。

SQL> alter table 表名 modify (字段 類型 default 默認值)

例子:

? ? alter table Student Modify Address varchar(50) default '地址不詳';

? ? alter table Student Modify JoinDate Date default sysdate;

Oracle注釋

添加表級注釋

SQL> COMMENT ON TABLE 表名 IS '注釋內容';

添加列級注釋

SQL> COMMENT ON COLUMN 表名.字段名 IS '注釋內容';

查看表級注釋

SQL> SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAME='表名';

查看列級注釋

SQL> SELECT * FROM USER_COL_COMMENTS WHERE COLUMN_NAME='字段名' AND COMMENTS IS NOT NULL;

刪除注釋(即,添加空注釋)

SQL> COMMENT ON TABLE 表名 IS '';

SQL> COMMENT ON COLUMN 表名.字段名 IS '';

Oracle序列

序列(SEQUENCE)是序列號生成器,可以為表中的行自動生成序列號,產生一組等間隔的數值(類型為數字)。不占用磁盤空間,占用內存。

其主要用途是生成表的主鍵值,可以在插入語句中引用,也可以通過查詢檢查當前值,或使序列增至下一個值。

創建序列

創建序列需要CREATE SEQUENCE系統權限。

序列的創建語法如下:

  CREATE SEQUENCE 序列名

  [INCREMENT BY n]

  [START WITH n]

  [{MAXVALUE/ MINVALUE n| NOMAXVALUE}]

  [{CYCLE|NOCYCLE}]

  [{CACHE n| NOCACHE}];


其中:

1)? INCREMENT BY用于定義序列的步長,如果省略,則默認為1,如果出現負值,則代表Oracle序列的值是按照此步長遞減的。

2)? START WITH 定義序列的初始值(即產生的第一個值),默認為1。

3)? MAXVALUE 定義序列生成器能產生的最大值,選項NOMAXVALUE是默認選項,代表沒有最大值定義。

4)? MINVALUE定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義。

5)? CYCLE和NOCYCLE 表示當序列生成器的值達到限制值后是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值;對于遞減序列達到最小值時,循環到最大值。

如果不循環,達到限制值后,繼續產生新值就會發生錯誤。

6)? CACHE(緩沖)定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能。

8)? CURRVAL 中存放序列的當前值,NEXTVAL 應在 CURRVAL 之前指定 ,二者應同時有效。

例子:

SQL> create sequence t1_seq increment by 1 start with 1;

使用序列

調用NEXTVAL將生成序列中的下一個序列號,調用時要指出序列名,即用以下方式調用: 序列名.NEXTVAL

CURRVAL用于產生序列的當前值,無論調用多少次都不會產生序列的下一個值。如果序列還沒有通過調用NEXTVAL產生過序列的下一個值,先引用CURRVAL沒有意義。調用CURRVAL的方法同上,要指出序列名,即用以下方式調用:序列名.CURRVAL

SQL> create table t1(id number,qq number,ww number);

SQL> insert into t1 values(t1_seq.nextval,1,1);

查看序列

SQL> select * from t1;

? ? ? ? ID? ? ? ? QQ? ? ? ? WW

----------? ? ----------? ? ----------

? ? ? ? 1? ? ? ? ? 1? ? ? ? ? 1

? ? ? ? 2? ? ? ? ? 1? ? ? ? ? 1

? ? ? ? 3? ? ? ? ? 1? ? ? ? ? 1

? ? ? ? 4? ? ? ? ? 1? ? ? ? ? 1

? ? ? ? 5? ? ? ? ? 1? ? ? ? ? 1

SQL> select t1_seq.currval from dual;

? CURRVAL

----------

? ? ? ? 5

SQL> select t1_seq.nextval from dual;

? NEXTVAL

----------

? ? ? ? 6

SQL> select t1_seq.nextval from dual;

? NEXTVAL

----------

? ? ? ? 7

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發此異常。 O...
    我想起個好名字閱讀 5,375評論 0 9
  • 第一天 7月13日OCP筆記: Oracle Ocp11g準備資料: OracleFundmentals 書 管理...
    fjxCode閱讀 2,831評論 0 4
  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,985評論 2 89
  • 《駱駝祥子》是老舍的一篇小說,剛進入書店,就被老舍這個名字吸引住了。于是就選中了一本《駱駝祥子》 初讀《駱駝祥子》...
    蘇sqj閱讀 274評論 0 0
  • 依舊中藥、太極。 太極本來是意念集中的活兒。意守丹田。一閉眼就跑掉了。完全不知道自己在做什么。 走路回去,小張熱情...
    湮滅降臨閱讀 149評論 0 0