/*視圖 視圖(view),稱爲虛表,在數據庫中不存在實體。 視圖本質上是對物理表(基表)的一種數據保護。讓開發者或者用戶只能看到基表中的部分數據。 */ --------建立視圖 --建立視圖的語法:create or replace view 視圖名 as query -- 常見一個視圖,查看僱員表的基本信息 create or replace view V_emp as select e.* from emp e with read only;--只讀視圖 --------------- 刪除視圖 drop view v_emp ------- 使用視圖(能夠向使用表同樣使用視圖,但本質不是表,只是上面這段代碼) select * from v_emp -----修改視圖中的數據 -----添加數據 insert into v_emp (empno,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values(1111,'viem','sggegwe',4444,sysdate,5555,22,20); /*注意: 經過視圖添加數據,數據最終添加到基本中,由於視圖是虛表。 視圖通常只是基表的部分數據,經過視圖向基表添加數據時,基本的數據只能添加一部分, 此時若是基表會對未提供的字段置null。 若是基本對未提供的字段要求不能爲null,這次添加會失敗。*/ ------------更新數據 update v_emp set comm=20 where empno=1111; /*注意:不能經過視圖更新視圖不存在的字段 */ ------------------刪除數據 delete from v_emp where empno=1111 -------------------視圖的應用 -------平均薪水的等級最低的部門,它的部門名稱是什麼 select vt3.deptno,d.dname from (select * from (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) VT2 where VT2.grade = (select min(vt1.grade) from (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) 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 ------------------再把視圖拿出來 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 ------------------------權限管理 --SQL四種語言:DDL,DML,DCL,TCL ---DDL(Data Definition Language)數據庫定義語言statements are used to define the database structure or schema. ---DML(Data Manipulation Language)數據操縱語言statements are used for managing data within schema objects. ---DCL(Data Control Language)數據庫控制語言 受權,角色控制等 ---TCL(Transaction Control Language)事務控制語言 --第一個使用scott帳戶是須要解鎖 alter user scott account unlock; --此時scott若是對數據庫進行DDL操做是沒有權限的。把建立視圖、建立表的權限分配給soctt --注意:權限性操做都要以sysdba什麼來操做。 ---- 使用system用戶爲scott增長權限: grant create view,create table to scott; /* 1.GRANT 賦於權限 經常使用的系統權限集合有如下三個: CONNECT(基本的鏈接), RESOURCE(程序開發), DBA(數據庫管理) 2.經常使用的數據對象權限有如下五個: 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; 3.刪除用戶 drop user 用戶名 cascade 四、設置用戶密碼登陸後失效,並要求修改密碼 alter user 用戶名 password expire; 五、帳戶鎖定和解鎖 alter user 用戶名 account lock; (鎖定) alter user 用戶名 account unlock;(解鎖) */ ----------------如何建立一個用戶並授予必定權限? --建立用戶 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 totest01; -- 回收權限 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; --查看用戶權限 select * from user_sys_privs; ----------------------------------------表 --數據庫數據類型 --其餘類型: --CLOB:最大長度4G -->大對象不多使用:若是存在大對象,通常的解決方案存入文件地址(地址爲程序所在應用服務器的相對路徑)。 --BLOB:存二進制文件 --注意: --在數據庫設計時,若是要存大文件(視頻,音頻等),必定不要用BLOB/CLOB,通用的解決方案都是文件的地址。 --------------------------表的建立 /*CREATE TABLE [schema.]table( column datatype [DEFAULT expr] , … );*/ -- 建立一個學生表 create table t_student ( sid number(4), name varchar2(20), phone char(11), brithday date, address varchar2(100) ) ---------- select * from t_student ------------刪除表 drop table t_student ---經過子查詢結果建立表: -- 經過其餘表結構建立表 create table t_emp as select * from emp; -- 只建立表的結構(複製表結構) creat table t_emp as select * from emp where 1=2; ------------------表的修改 -- [1]給表添加字段 alter table t_student add grade number(2) -- [2]刪除表的字段 alter table t_student drop column grade; -- [3] 修改表字段 alter table t_student modify(address varchar2(150)) -- [4]重命名 rename t_student to t_student1 ---------- select * from t_student1 -----------------------------Insert/update/delete ------------insert (增長數據)(insert是事務操做,須要提交事務。) --INSERT INTO table [(column [, column...])] VALUES (value [, value...]); insert into t_student1(sid,name,phone,brithday,address) values (1111,'dtydyyd',13345678987,sysdate,'fewfewfef') --------若是是增長所有列數據能夠: insert into t_student1 values (1121,'dty1dyyd',13345678987,sysdate,'fewfgewfef') --UPDATE table SET column = value [, column = value] … [WHERE condition]; -------------update(更改數據) update t_student1 set address='86786',name='8783783' where sid=1111 --DELETE [FROM] table [WHERE condition]; -------------delete(刪除數據) delete from t_student1 where sid=1111 --刪除表中的全部數據-沒有事務-速度快 truncate table t_student1; ---------------序列 --序列是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; -- 序列的應用 insert into t_student1 values(seq_empno.nextval,'dty1dyyd',13345678987,sysdate,'fewfgewfef') -- 刪除序列 drop sequence seq_empno ---------在數據庫開發設計表時,若是須要一個字段的值是自增的話,優先考慮序列。 ---------------------事務 /*事務概念 事務(Transaction)是一個操做序列。這些操做要麼都作,要麼都不作,是一個不可分割的工做單位,是數據庫環境中的邏輯工做單位。 事務是爲了保證數據庫的完整性。 事務不能嵌套 在oracle中,沒有事務開始的語句。一個Transaction起始於一條DML(Insert、Update和Delete )語句,結束於如下的幾種狀況: •用戶顯式執行Commit語句提交操做或Rollback語句回退。 •當執行DDL(Create、Alter、Drop)語句事務自動提交。 •用戶正常斷開鏈接時,Transaction自動提交。 •系統崩潰或斷電時事務自動回退。 */ select * from t_student1; -- 事務以DML開始 -- beginTransaction(insert/update/delete) insert into t_student1 values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef'); commit;-- 加入數據庫,顯示的事務結束(endTransaction) --rollback;退回 --【2】隱式的事務結束(不須要commit; rollback;) /* create table abc( sid number ) */ /*事務結合java代碼的格式 try{ insert … … insert … commit }catch(Exception e){ rollback }finlly{ 關閉數據庫 } */ --------------------保存點(save point) -- beginTrans insert into t_student1 values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef'); insert into t_student1 values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef'); savepoint sp1;--保存點 insert into t_student1 values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef'); insert into t_student1 values(2222,'dty1dyyd',13345678987,sysdate,'fewfgewfef'); rollback to sp1;--若是這一段有異常就退回保存點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. 原子性(Atomicity) 一個原子事務要麼完整執行,要麼乾脆不執行。這意味着,工做單元中的每項任務都必須正確執行。若是有任一任務執行失敗,則整個工做單元或事務就會被終止。即此前對數據所做的任何修改都將被撤銷。若是全部任務都被成功執行,事務就會被提交,即對數據所做的修改將會是永久性的。 2. 一致性(Consistency) 一致性表明了底層數據存儲的完整性。它必須由事務系統和應用開發人員共同來保證。事務系統經過保證事務的原子性,隔離性和持久性來知足這一要求; 應用開發人員則須要保證數據庫有適當的約束(主鍵,引用完整性等),而且工做單元中所實現的業務邏輯不會致使數據的不一致(即,數據預期所表達的現實業務狀況不相一致)。例如,在一次轉帳過程當中,從某一帳戶中扣除的金額必須與另外一帳戶中存入的金額相等。支付寶帳號100 你讀到餘額要取,有人向你轉100 可是事物沒提交(這時候你讀到的餘額應該是100,而不是200) 這種就是一致性 3. 隔離性(Isolation) 隔離性意味着事務必須在不干擾其餘進程或事務的前提下獨立執行。換言之,在事務或工做單元執行完畢以前,其所訪問的數據不能受系統其餘部分的影響。 4. 持久性(Durability) 持久性表示在某個事務的執行過程當中,對數據所做的全部改動都必須在事務成功結束前保存至某種物理存儲設備。這樣能夠保證,所做的修改在任何系統癱瘓時不至於丟失。 */ ---------------------------約束 /* 當咱們建立表的時候,同時能夠指定所插入數據的一些規則,好比說某個字段不能爲空值,某個字段的值(好比年齡)不能小於零等等,這些規則稱爲約束。約束是在表上強制執行的數據校驗規則. 常見約束: 1.NOT NULL 非空 2.UNIQUE Key 惟一鍵 3.PRIMARY KEY 主鍵 4.FOREIGN KEY 外鍵 5.CHECK 自定義檢查約束 */ ----------------------主鍵約束(primary key) --主鍵用於惟一標識一條記錄。主鍵值不可爲空,也不容許出現重複。 -- 建立表 -- 建立列級約束-顯式指定名稱,pk_sid create table t_stydent( sid number(4) constraint pk_sid primary key, name varchar2(20) ) -- 建立列級約束-沒式顯示指定名稱,系統隨機命名SYS_C.. create table t_stydent( sid number(4) primary key, name varchar2(20) ) ----------------表級約束:當多個列(字段)參與約束,能夠用表級約束。 --- 建立表,以表級約束 create table t_stydent( sid number(4), photo char(11), constraint pk_sid primary key (photo,name) ) create table t_stydent( sid number(4), photo char(11), primary key (photo,name) ) -------------------非空約束(not null)確保字段值不容許爲空,只能在列級定義 create table t_stydent( sid number(4) primary key, name varchar2(20) constraint n_name1 not null ) create table t_stydent( sid number(4) primary key, name varchar2(20) not null ) -- 添加操做 insert into t_student(sid) values(1000) ------------------------惟一性約束(UNIQUE) --惟一性約束條件確保所在的字段或者字段組合不出現重複值 --惟一性約束條件的字段容許出現空值 --Oracle將爲惟一性約束條件建立對應的惟一性索引 create table t_stydent( sid number(4) primary key, name varchar2(20) constraint up_name unique ) create table t_stydent( sid number(4), name varchar2(20), constraint up_name unique(sid,name) ) ---------------------自定義約束 --Check約束用於對一個屬性的值加以限制 create table t_stydent( sid number(4), name varchar2(20), age number(3) check(age>0 and age<100) ) ----------------外鍵約束 create table t_stydent( sid number(4), name varchar2(20), age number(3), tid number(4) constraint fk_tid foreign key(tid) references t_teacher(tid) on delete cascade ) create table t_teacher( tid number(4) primary key, name vachar2(4) not null ) insert into t_teacher values(1,'alex'); insert into t_student values(1000,'18612341234',15,1) /* 對於主表的刪除和修改主鍵值的操做,會對依賴關係產生影響,以刪除爲例:當要刪除主表的某個記錄(即刪除一個主鍵值,那麼對依賴的影響可採起下列3種作法: 1.RESTRICT方式:只有當依賴表中沒有一個外鍵值與要刪除的主表中主鍵值相對應時,纔可執行刪除操做。 2.CASCADE方式:將依賴表中全部外鍵值與主表中要刪除的主鍵值相對應的記錄一塊兒刪除 3.SET NULL方式:將依賴表中全部與主表中被刪除的主鍵值相對應的外鍵值設爲空值 FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) [ON DELETE [CASCADE|SET NULL]] 如省略on短語,缺省爲第一中處理方式。 */