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