標籤:str null sum employees 別名 表資料 prim 回退 replace
Unit05: 視圖、序列、索引 、 約束
視圖資料庫物件之一視圖在SQL語句中體現的角色與表相同,但它並非一張真實存在的表,它對應的是一個查詢語句的結果集。建立一個查看10號部門員工資訊的視圖:CREATE VIEW v_emp_dept10ASSELECT ename,sal,job,deptnoFROM empWHERE deptno=10DESC v_emp_dept10SELECT * FROM v_emp_dept10修改視圖就是替換該視圖對應的子查詢。使用CREATE OR REPLACE即可。若視圖不存在就建立,存在則替換。視圖對應的子查詢的欄位若有別名,則該視圖對應的欄位名就是這個別名。若子查詢的欄位含有函數或運算式,那麼該欄位必須給別名。CREATE OR REPLACE VIEW v_emp_dept10ASSELECT empno id,ename name, sal salary,job,deptnoFROM empWHERE deptno=10對視圖進行DML操作就是對視圖資料來源的基礎資料表的操作。INSERT INTO v_emp_dept10(id,name,salary,job,deptno)VALUES(1001,‘JACK‘,3000,‘CLERK‘,10)SELECT * FROM v_emp_dept10SELECT * FROM emp插入資料時,視圖看不到的欄位都插入基礎資料表對應欄位的預設值,所以不能違反基礎資料表相應欄位的約束條件,尤其是看不到的欄位的非空約束,否則可能導致插入失敗。UPDATE v_emp_dept10SET name=‘JACKSON‘WHERE id=1001SELECT * FROM v_emp_dept10SELECT * FROM empDELETE FROM v_emp_dept10WHERE id=1001對視圖進行DML操作可能導致對基表資料"汙染"即:對視圖進行DML操作的資料檢視對其 不可見,卻修改了基表該資料。INSERT INTO v_emp_dept10(id,name,salary,job,deptno)VALUES(1001,‘JACK‘,3000,‘CLERK‘,20)SELECT * FROM v_emp_dept10SELECT * FROM empUPDATE v_emp_dept10SET deptno=20為視圖添加檢查選項可以避免對視圖進行DML操作時汙染基表。CREATE OR REPLACE VIEW v_emp_dept10ASSELECT empno id,ename name, sal salary,job,deptnoFROM empWHERE deptno=10WITH CHECK OPTION為視圖添加唯讀選項後,則不能對視圖進行DML操作。CREATE OR REPLACE VIEW v_emp_dept10ASSELECT empno id,ename name, sal salary,job,deptnoFROM empWHERE deptno=10WITH READ ONLYSELECT table_name FROM user_tables視圖根據對應的子查詢不同,分為簡單視圖和複雜視圖。當子查詢中含有函數,運算式,分組去重,關聯查詢時,該視圖就是一個複雜視圖。複雜視圖不能進行DML操作。建立一個包含每個部門薪資情況的視圖CREATE VIEW v_emp_salASSELECT AVG(e.sal) avg_sal, SUM(e.sal) sum_sal, MIN(e.sal) min_sal, MAX(e.sal) max_sal, d.deptno,d.dnameFROM emp e,dept dWHERE e.deptno=d.deptnoGROUP BY d.deptno,d.dnameSELECT * FROM v_emp_sal查看哪個員工的工資高於其部門平均工資?SELECT e.ename,e.sal,e.deptnoFROM emp e,v_emp_sal vWHERE e.deptno=v.deptnoAND e.sal>v.avg_sal刪除視圖DROP VIEW v_emp_dept10刪除視圖中的資料會將基表中對應資料刪除,但是刪除視圖本身不會對基表資料產生影響。序列序列也是資料庫物件之一作用是產生一系列數字。通常使用它為某表的主鍵欄位提供值使用。CREATE SEQUENCE seq_emp_idSTART WITH 1INCREMENT BY 1序列支援兩個偽列:NEXTVAL:擷取序列下一個數字CURRVAL:擷取序列當前數字NEXTVAL會導致序列發生步進,且序列是不能回退的。CURRVAL是擷取序列最後一次產生的數字,新建立的序列至少在調用以此NEXTVAL後才可以使用CURRVAL。SELECT seq_emp_id.CURRVALFROM dualSELECT * FROM empINSERT INTO emp(empno,ename,sal,job,deptno)VALUES(seq_emp_id.NEXTVAL,‘JACK‘,3000, ‘CLERK‘,10)UUID的產生方式:SELECT SYS_GUID() FROM dual刪除序列DROP SEQUENCE seq_emp_idCREATE TABLE employees1 ( eid NUMBER(6) UNIQUE, name VARCHAR2(30), email VARCHAR2(50), salary NUMBER(7, 2), hiredate DATE, CONSTRAINT employees1_email_uk UNIQUE(email));INSERT INTO employees1(eid,name,email)VALUES(NULL,‘JACK‘,NULL)SELECT * FROM employees1CREATE TABLE employees2 (eid NUMBER(6) PRIMARY KEY,name VARCHAR2(30),email VARCHAR2(50),salary NUMBER(7, 2),hiredate DATE);INSERT INTO employees2(eid,name)VALUES(1,‘JACK‘)
JAVA-Unit05: 視圖、序列、索引 、 約束