1 數據庫對象
1.1 視圖(B)
視圖(view),稱為虛表,在數據庫中不存在實體。
視圖本質上是對物理表(基表)的一種數據保護。讓開發者或者用戶只能看到基表中的部分數據。
1.1.1 創建視圖
創建視圖的語法
create or replace view 視圖名 as query
create or replace view v$empinfo as select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.deptno from emp e;
1.1.2 使用視圖
可以向使用表一樣使用視圖
-- 使用視圖 select * from v$empinfo; -- 刪除視圖 drop view v$empinfo;
修改視圖中的數據
添加數據
-- 向視圖添加數據 insert into v$empinfo(empno,ename,job,mgr,hiredate,deptno) values(1090,'cai90','singer',7839,sysdate,30); select * from emp e;
通過視圖添加數據,數據最終添加到基本中,因為視圖是虛表。
視圖一般只是基表的部分數據,通過視圖向基表添加數據時,基本的數據只能添加一部分,此時如果基表會對未提供的字段置null。如果基本對未提供的字段要求不能為null,此次添加會失敗。
insert into v$empinfo(ename,job,mgr,hiredate,deptno) values('cai100','singer',7839,sysdate,30);
刪除數據
-- 【2】刪除數據 delete from v$empinfo where empno = 1090
更新數據
update v$empinfo set comm = 20 where empno = 1080
不能通過視圖更新視圖不存在的字段
只讀視圖
create or replace view v$empinfo as select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.deptno from emp e with read only;
insert into v$empinfo(empno,ename,job,mgr,hiredate,deptno) values(1110,'cai100','singer',7839,sysdate,30);
1.1.3 視圖的應用
-- 平均薪水的等級最低的部門,它的部門名稱是什么 select vt3.deptno, d.dname from (select * from v$AvgSalGrade VT2 where VT2.grade = (select min(vt1.grade) from v$AvgSalGrade VT1)) VT3 join dept d on vt3.deptno = d.deptno -- 通過視圖優化 create or replace view v$AvgSalGrade as select vt0.deptno,vt0.avgsal,sg.grade from (select e.deptno,avg(e.sal) "AVGSAL" from emp e group by e.deptno) VT0 join salgrade sg on vt0.avgsal between sg.losal and sg.hisal with read only
1.2 權限管理(B)
第一個使用scott賬戶是需要解鎖
alter user scott account unlock;
此時scott如果對數據庫進行DDL操作是沒有權限的。把創建視圖、創建表的權限分配給soctt
注意:權限性操作都要以sysdba什么來操作。

如何創建一個用戶並授予一定權限?
--創建用戶 create user test01 identified by 123 -- 查看是否創建成功 select * from dba_users where username = 'TEST01'; -- 授權登錄(會話)權限 grant create session to test01; -- 默認用戶沒有任何表,而且不具備操作其他表的權限。 --select * from emp; -- 授權soctt.emp所有權限(all)給test01 grant all on scott.emp to test01; -- 回收權限 revoke all on scott.emp from test01; -- 分配創建表的權限 grant create table to test01; -- 此時test01用戶可以select,但不能insert數據 grant unlimited tablespace to test01; -- 修改用戶密碼 alter user test01 identified by 1234; -- 級聯刪除用戶 drop user test01 cascade;
1.GRANT 賦於權限 常用的系統角色權限集合有以下三個: CONNECT(基本的連接), RESOURCE(程序開發), DBA(數據庫管理) 常用的數據對象權限有以下五個: ALL ON 數據對象名, SELECT ON 數據對象名, UPDATE ON 數據對象名, DELETE ON 數據對象名, INSERT ON 數據對象名, ALTER ON 數據對象名 GRANT CONNECT, RESOURCE TO 用戶名; GRANT SELECT ON 表名 TO 用戶名; GRANT SELECT, INSERT, DELETE ON表名 TO 用戶名1, 用戶名2; 2.REVOKE 回收權限 REVOKE CONNECT, RESOURCE FROM 用戶名; REVOKE SELECT ON 表名 FROM 用戶名; REVOKE SELECT, INSERT, DELETE ON 表名 FROM 用戶名1, 用戶名2;
查看用戶權限
select * from user_sys_privs;
1.3 表
數據庫數據類型
number(x,y) |
數值型 |
最長是x位,y位小數 |
varchar2(maxlength) |
變長字符串 |
maxlength這個參數的上限是32767字節 |
char(max_length) |
定長字符串 |
最大2000字節 |
Date |
日期時間 |
只能精確到秒。 |
timestamp |
時間戳 |
精確到微秒 |
long |
長字符串 |
最大支持2GB |
其他類型:
CLOB:最大長度4G -->大對象很少使用:如果存在大對象,一般的解決方案存入文件地址(地址為程序所在應用服務器的相對路徑)。
BLOB:存二進制文件
注意:
在數據庫設計時,如果要存大文件(視頻,音頻等),一定不要用BLOB/CLOB,通用的解決方案都是文件的地址。
1.3.1 表的創建
創建表的語法:
CREATE TABLE [schema.]table( column datatype [DEFAULT expr] , … );
創建一個學生表
T_STUINFO(sid,name,phone,gender,birthday,address)
create table t_stuinfo( sid number(4), name varchar2(20), phone char(11), gender number(1), birthday date, address varchar2(100) )
開發工具生成
create table T_STUINFO ( sid NUMBER(4) not null, name VARCHAR2(20) not null, phone CHAR(11), gender NUMBER(1) default 1 not null, birthday DATE, address VARCHAR2(100) )
通過子查詢結果創建表
-- 通過其他表結構創建表 create table t_emp as select * from emp; -- 只創建表的結構(復制表結構) create table t_emp2 as select * from emp where 1=2; select * from t_emp; select * from t_emp2;
1.3.2 表的修改(C)
-- 修改表操作 -- [1]給表添加字段 alter table t_stuinfo add grade number(2) -- [2]刪除表的字段 alter table t_stuinfo drop column grade -- [3] 修改表字段 alter table t_stuinfo modify(address varchar2(150)) -- [4]重命名 rename t_stuinfo to t_stuinfo2
Insert/update/delete(A)
1.3.3 insert
語法
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
-- insert insert into t_emp2(empno,ename,job,mgr,hiredate,sal,comm,deptno) values(1010,'cai10','singer',7938,sysdate,1000,1,10) insert into t_emp2(empno,job,ename,mgr,hiredate,sal,comm,deptno) values(1010,'singer','cai10',7938,sysdate,1000,1,10) -- insert是事務操作,需要提交事務。 insert into t_emp2 values(1020,'cai20','singer',7938,sysdate,2000,2,10)
1.3.4 update
update語法
UPDATE table SET column = value [, column = value] … [WHERE condition];
update t_emp2 set ename = 'cai22',sal = 2200 where empno = 1020
1.3.5 delete
delete 語法
DELETE [FROM] table [WHERE condition];
-- delete delete from t_emp2 where empno = 1010 --刪除表中的所有數據-沒有事務-速度快 truncate table t_emp2;
1.4 序列(A)
序列是oracle專有的對象,它用來產生一個自動遞增的數列。
-- 創建序列 create sequence seq_empno start with 1 increment by 1
-- 序列的使用 -- 序列中的下一個值,從定義(start with)的值開始 select seq_empno.nextval from dual; -- 獲取序列的當前值 select seq_empno.currval from dual; -- 序列的應用 select * from t_emp2; insert into t_emp2 values(seq_empno.nextval,'cai10','singer',7938,sysdate,1000,1,10)
在數據庫開發設計表時,如果需要一個字段的值是自增的話,優先考慮序列。
1.5 事務(A)
1.5.1 事務概念
事務(Transaction)是一個操作序列。這些操作要么都做,要么都不做,是一個不可分割的工作單位,是數據庫環境中的邏輯工作單位。
事務是為了保證數據庫的完整性。
事務不能嵌套
在oracle中,沒有事務開始的語句。一個Transaction起始於一條DML(Insert、Update和Delete )語句,結束於以下的幾種情況:
- 用戶顯式執行Commit語句提交操作或Rollback語句回退。
- 當執行DDL(Create、Alter、Drop)語句事務自動提交。
- 用戶正常斷開連接時,Transaction自動提交。
- 系統崩潰或斷電時事務自動回退。
-- beginTransaction(insert/update/delete) insert into t_emp2 values(6,'cai40','singer',7938,sysdate,4000,4,10); insert into t_emp2 values(7,'cai50','singer',7938,sysdate,5000,5,10); -- 顯式的事務結束(endTransaction) -- commit; rollback; -- beginTransaction(insert/update/delete) insert into t_emp2 values(6,'cai40','singer',7938,sysdate,4000,4,10); insert into t_emp2 values(7,'cai50','singer',7938,sysdate,5000,5,10); --【2】隱式的事務結束 create table abc( sid number )
事務結合java代碼的格式
try{ insert … … insert … commit }catch(Exception e){ rollback }finlly{ 關閉數據庫 }
1.5.2 保存點(save point)
-- beginTrans insert into t_emp2 values(9,'cai40','singer',7938,sysdate,4000,4,10); insert into t_emp2 values(10,'cai50','singer',7938,sysdate,5000,5,10); select * from t_emp2; savepoint sp1; insert into t_emp2 values(11,'cai40','singer',7938,sysdate,4000,4,10); insert into t_emp2 values(12,'cai50','singer',7938,sysdate,5000,5,10); select * from t_emp2; rollback to sp1; commit;
save point 保持當前數據庫的狀態點。以便后續通過rollback回滾到指定狀態點。
try{ insert … insert … save point sp1 insert … insert … save point sp2 commit }catch(AException e){ rollback }catch(BException e){ rollback to sp1 } finlly{ 關閉數據庫 }
1.5.3 事務的特性
事務四大特征:原子性,一致性,隔離性和持久性。
1. 原子性(Atomicity)
一個原子事務要么完整執行,要么干脆不執行。這意味着,工作單元中的每項任務都必須正確執行。如果有任一任務執行失敗,則整個工作單元或事務就會被終止。即此前對數據所作的任何修改都將被撤銷。如果所有任務都被成功執行,事務就會被提交,即對數據所作的修改將會是永久性的。
2. 一致性(Consistency)
一致性代表了底層數據存儲的完整性。它必須由事務系統和應用開發人員共同來保證。事務系統通過保證事務的原子性,隔離性和持久性來滿足這一要求; 應用開發人員則需要保證數據庫有適當的約束(主鍵,引用完整性等),並且工作單元中所實現的業務邏輯不會導致數據的不一致(即,數據預期所表達的現實業務情況不相一致)。例如,在一次轉賬過程中,從某一賬戶中扣除的金額必須與另一賬戶中存入的金額相等。支付寶賬號100 你讀到余額要取,有人向你轉100 但是事物沒提交(這時候你讀到的余額應該是100,而不是200) 這種就是一致性
3. 隔離性(Isolation)
隔離性意味着事務必須在不干擾其他進程或事務的前提下獨立執行。換言之,在事務或工作單元執行完畢之前,其所訪問的數據不能受系統其他部分的影響。
4. 持久性(Durability)
持久性表示在某個事務的執行過程中,對數據所作的所有改動都必須在事務成功結束前保存至某種物理存儲設備。這樣可以保證,所作的修改在任何系統癱瘓時不至於丟失。
1.6 約束
當我們創建表的時候,同時可以指定所插入數據的一些規則,比如說某個字段不能為空值,某個字段的值(比如年齡)不能小於零等等,這些規則稱為約束。約束是在表上強制執行的數據校驗規則.
常見約束:
- NOT NULL 非空
- UNIQUE Key 唯一鍵
- PRIMARY KEY 主鍵
- FOREIGN KEY 外鍵
- CHECK 自定義檢查約束
1.6.1 主鍵約束(primary key)
主鍵用於唯一標識一條記錄。主鍵值不可為空,也不允許出現重復。
-- 創建表 -- 創建列級約束-顯式指定名稱,pk_sid create table t_stuInfo( sid number(4) constraint pk_sid primary key, name varchar2(20) ) -- 創建列級約束-沒式顯示指定名稱,系統隨機命名SYS_C.. create table t_stuInfo2( sid number(4) primary key, name varchar2(20) )
表級約束:當多個列(字段)參與約束,可以用表級約束。
-- 創建表,以表級約束 create table t_stuInfo3( sid number(4), phone char(11), name varchar2(20), constraint pk_stuinfo primary key(phone,name) ) create table t_stuInfo4( sid number(4), phone char(11), name varchar2(20), primary key(phone,name) )
1.6.2 非空約束(not null)
確保字段值不允許為空
只能在列級定義
-- 創建列級約束-顯式指定名稱,pk_sid create table t_stuInfo5( sid number(4) primary key, phone char(11) constraint nn_phone not null ) create table t_stuInfo5( sid number(4) primary key, phone char(11) not null ) -- 添加操作 insert into t_stuinfo5(sid) values(1000)
1.6.3 唯一性約束(UNIQUE)
唯一性約束條件確保所在的字段或者字段組合不出現重復值
唯一性約束條件的字段允許出現空值
Oracle將為唯一性約束條件創建對應的唯一性索引
create table t_stuInfo6( sid number(4) primary key, phone char(11) constraint uq_phone unique ) create table t_stuInfo6( sid number(4) primary key, phone char(11) unique ) create table t_stuInfo6( sid number(4) primary key, phone char(11) unique not null ) drop table t_stuInfo6; create table t_stuInfo6( sid number(4) primary key, phone char(11), constraint uq_phone unique(phone) ) insert into t_stuinfo6(sid,phone) values(1000,'18612340000') insert into t_stuinfo6(sid,phone) values(1001,'18612340000')
1.6.4 自定義約束
Check約束用於對一個屬性的值加以限制
create table t_stuInfo7( sid number(4) primary key, phone char(11) unique, age number(3) check(age>0 and age<100) ) insert into t_stuInfo7 values(1000,'18612341234',-10)
create table emp3 ( id number(4) primary key, age number(2) check(age > 0 and age < 100), salary number(7,2), sex char(1), constraint salary_check check(salary > 0) )
1.6.5 外鍵約束
create table t_stuInfo8( sid number(4) primary key, phone char(11) unique, tid number(4), constraint fk_tid foreign key(tid) references t_teacher1(tid) ) create table t_teacher1( tid number(4) primary key, name varchar2(20) not null ) insert into t_teacher1 values(1,'alex'); insert into t_stuInfo8 values(1000,'18612341234',1)
對於主表的刪除和修改主鍵值的操作,會對依賴關系產生影響,以刪除為例:當要刪除主表的某個記錄(即刪除一個主鍵值,那么對依賴的影響可采取下列3種做法:
- RESTRICT方式:只有當依賴表中沒有一個外鍵值與要刪除的主表中主鍵值相對應時,才可執行刪除操作。
- CASCADE方式:將依賴表中所有外鍵值與主表中要刪除的主鍵值相對應的記錄一起刪除
- SET NULL方式:將依賴表中所有與主表中被刪除的主鍵值相對應的外鍵值設為空值
FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)
[ON DELETE [CASCADE|SET NULL]] 如省略on短語,缺省為第一種處理方式。
drop table t_stuinfo8; create table t_stuInfo8( sid number(4) primary key, phone char(11) unique, tid number(4), constraint fk_tid foreign key(tid) references t_teacher1(tid) ) create table t_stuInfo8( sid number(4) primary key, phone char(11) unique, tid number(4), constraint fk_tid foreign key(tid) references t_teacher1(tid) on DELETE CASCADE ) create table t_teacher1( tid number(4) primary key, name varchar2(20) not null ) insert into DELETE values(1,'alex'); insert into t_stuInfo8 values(1000,'18612341234',1) select * from t_stuInfo8 delete from t_teacher1 where tid = 1;