為方便測試,創(chuàng)建表emp,包含以下信息:

視圖VIEW
視圖是數(shù)據(jù)庫對象之一,在SQL語句中體現(xiàn)的角色與表一致。但是視圖并非一張真實存在的表,它只是一個查詢語句對應的結果集。
CREATE VIEW v_emp_10 AS SELECT empno, ename, sal, deptno FROM emp WHERE deptno = 10 DESC v_emp_10
SELECT * FROM v_emp_10
視圖對應的子查詢中的字段可以指定別名,這樣該視圖對應的字段名就是這個別名。
當一個字段是函數(shù)或者表達式,那么該字段必須指定別名
CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10
視圖根據(jù)對應的子查詢不同,分為簡單視圖和復雜視圖
簡單視圖:對應的子查詢不含有函數(shù),表達式,分組,去重,關聯(lián)查詢。
除了簡單視圖就是復雜視圖
簡單視圖可以進行DML操作,對該視圖的操作就是對該視圖數(shù)據(jù)來源的基礎表進行的操作。
復雜視圖不允許進行DML操作。
對簡單視圖進行DML操作也不能違反基礎表的約束條件。
對視圖進行DML操作,視圖對基礎表操作時,只能對視圖可見的字段進行。
INSERT INTO v_emp_10(id,name,salary,deptno) VALUES (1001,'JACK',3000,10)
SELECT * FROM v_emp_10
SELECT * FROM emp
UPDATE v_emp_10 SET salary=4000 WHERE id=1001 DELETE FROM v_emp_10 WHERE id=1001
對視圖的不當DML操作會污染基表數(shù)據(jù)
即:對視圖進行DML操作后,視圖對基礎表對應數(shù)據(jù)進行該DML操作,但是操作后視圖卻對該記錄不可見。
INSERT INTO v_emp_10(id,name,salary,deptno) VALUES(1001,'JACK',3000,20)
UPDATE v_emp_10 SET deptno=20
DELETE不會產(chǎn)生污染現(xiàn)象。
DELETE FROM v_emp_10 WHERE deptno=20
為視圖添加檢查選項,可以避免對視圖操作而導致的對基表的數(shù)據(jù)污染。
WITH CHECK OPTION
該選項要求對視圖進行DML操作后,該記錄必須對視圖可見。
CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10 WITH CHECK OPTION
WITH READ ONLY
只讀選項
只讀選項要求對視圖僅能進行查詢操作,不能進行任何DML操作。
CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10 WITH READ ONLY
常用的數(shù)據(jù)庫的數(shù)據(jù)字典
USER_OBJECTS:記錄用戶創(chuàng)建過的所有數(shù)據(jù)庫對象
SELECT object_name,object_type FROM user_objects WHERE object_type='VIEW'?
USER_VIEWS:專門記錄曾經(jīng)創(chuàng)建過的視圖信息
SELECT view_name,text FROM user_views WHERE view_name LIKE '%EMP%'
USER_TABLES:專門記錄曾經(jīng)創(chuàng)建過的表的信息
SELECT table_name FROM user_tables
刪除視圖
DROP VIEW v_emp_10
創(chuàng)建復雜視圖
創(chuàng)建一張視圖,包含員工工資及相關部門信息
包含:每個部門的平均工資,最大,最小,工資總和,以及對應的部門名稱,部門編號。
CREATE OR REPLACE VIEW v_emp_salinfo AS SELECT AVG(e.sal) avg_sal,MAX(e.sal) max_sal,MIN(e.sal) min_sal,SUM(e.sal) sum_sal,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno GROUP BY d.deptno,d.dname,d.loc
SELECT * FROM v_emp_salinfo
查看哪些員工的工資高于其所在部門平均工資?
SELECT e.ename,e.sal,e.deptno FROM emp e,v_emp_salinfo v WHERE e.deptno=v.deptno
AND e.sal>v.avg_sal
序列SEQUENCE
序列是數(shù)據(jù)庫對象之一,作用是根據(jù)指定的規(guī)則生成一系列數(shù)字。通常使用序列生成的
數(shù)字是為表中的主鍵字段提供值使用。
CREATE SEQUENCE seq_emp_id START WITH 1 INCREMENT BY 1
序列支持兩個偽列:
NEXTVAL:獲取序列的下一個數(shù)字,如果是新創(chuàng)建的序列,那么會從START WITH開始返回。
之后則是用上次生成的數(shù)字加上步長來得到本次生成的數(shù)字返回。
需要注意,序列是不能后退的。并且不受事務控制。
CURRVAL:獲取序列最后生成的數(shù)字,新創(chuàng)建的序列至少調用NEXTVAL生成一個數(shù)字后才可以使用。CURRVAL不會導致序列步進。
SELECT seq_emp_id.NEXTVAL FROM dual
SELECT seq_emp_id.CURRVAL FROM dual
使用序列為EMP表主鍵字段提供值:
INSERT INTO emp(empno,ename,job,sal,deptno) VALUES (seq_emp_id.NEXTVAL,'JACK','CLERK',3000,10)
SELECT * FROM emp
刪除一個序列
DROP SEQUENCE seq_emp_id
序列的數(shù)據(jù)字典
SELECT * FROM USER_SEQUENCES
索引INDEX
索引是數(shù)據(jù)庫對象之一,作用是提高查詢效率
索引的創(chuàng)建時是數(shù)據(jù)庫自行完成的,并且數(shù)據(jù)庫會在適當?shù)臅r候自動使用索引。
CREATE INDEX idx_emp_ename ON emp(ename)
經(jīng)常出現(xiàn)在WHERE中和ORDER BY中的字段要添加索引。經(jīng)常出現(xiàn)在DISTINCT后面的字段也可以添加索引。
需要注意,對于字符串類型字段,若在WHERE中使用LIKE進行過濾時,是不會用到索引的。
約束
非空約束
CREATETABLE employees(
eidNUMBER(6),
nameVARCHAR2(30)NOTNULL,
salaryNUMBER(7,2),
hiredate DATE
CONSTRAINTemployees_hiredate_nn NOT NULL
)
添加非空約束
ALTER TABLE employees MODIFY(eid NUMBER(6) NOT NULL)
取消非空約束
ALTER TABLE employees MODIFY(eid NUMBER(6) NULL)
唯一性約束
CREATE TABLE employees2 (
eid NUMBER(6) UNIQUE,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)
)
增加唯一性約束
ALTER TABLE employees ADD CONSTRAINT employees_name_uk UNIQUE(name)
測試
INSERT INTO employees2
(eid,name,email)
VALUES
(NULL,'jack',NULL)
SELECT * FROM employees2
主鍵約束
一張表只能有一個字段定義主鍵約束,主鍵約束要求該字段非空且唯一
CREATE TABLE employees3 (
eid NUMBER(6) PRIMARY KEY,
name VARCHAR2(30),
email VARCHAR2(50),
salary NUMBER(7, 2),
hiredate DATE
)
增加主鍵約束
ALTER TABLE employees3 ADD CONSTRAINT employees3_eid_pk PRIMARY KEY(eid);
測試
INSERT INTO employees3
(eid,name,email)
VALUES
(2,'jack','jack@123.com')
外鍵約束
外鍵約束條件定義在兩個表的字段或一個表的兩個字段上,用于保證相關兩個字段的關系。比如emp表的deptno列參照dept表的deptno列,則dept稱作主表或父表,emp表稱作從表或子表。
CREATE TABLE employees4(
eidNUMBER(6),
nameVARCHAR2(30),
salaryNUMBER(7,2),
deptnoNUMBER(4)
);
ALTER TABLE employees4 ADD CONSTRAINT employees4_deptno_fk FOREIGN KEY(deptno) REFERENCES dept(deptno);
外鍵約束條件包括兩個方面的數(shù)據(jù)約束:
從表上定義的外鍵的列值,必須從主表被參照的列值中選取,或者為NULL;
當主表參照列的值被從表參照時,主表的該行記錄不允許被刪除。
檢查約束
ALTER TABLE employees4 ADD CONSTRAINT employees4_salary_check CHECK(salary>2000);