為方便測(cè)試措嵌,創(chuàng)建表emp躲叼,包含以下信息:
視圖VIEW
視圖是數(shù)據(jù)庫(kù)對(duì)象之一,在SQL語(yǔ)句中體現(xiàn)的角色與表一致企巢。但是視圖并非一張真實(shí)存在的表枫慷,它只是一個(gè)查詢語(yǔ)句對(duì)應(yīng)的結(jié)果集。
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
視圖對(duì)應(yīng)的子查詢中的字段可以指定別名,這樣該視圖對(duì)應(yīng)的字段名就是這個(gè)別名流礁。
當(dāng)一個(gè)字段是函數(shù)或者表達(dá)式涕俗,那么該字段必須指定別名
CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10
視圖根據(jù)對(duì)應(yīng)的子查詢不同,分為簡(jiǎn)單視圖和復(fù)雜視圖
簡(jiǎn)單視圖:對(duì)應(yīng)的子查詢不含有函數(shù)神帅,表達(dá)式再姑,分組,去重找御,關(guān)聯(lián)查詢砌函。
除了簡(jiǎn)單視圖就是復(fù)雜視圖
簡(jiǎn)單視圖可以進(jìn)行DML操作平道,對(duì)該視圖的操作就是對(duì)該視圖數(shù)據(jù)來源的基礎(chǔ)表進(jìn)行的操作。
復(fù)雜視圖不允許進(jìn)行DML操作。
對(duì)簡(jiǎn)單視圖進(jìn)行DML操作也不能違反基礎(chǔ)表的約束條件鹃操。
對(duì)視圖進(jìn)行DML操作,視圖對(duì)基礎(chǔ)表操作時(shí)生真,只能對(duì)視圖可見的字段進(jìn)行什燕。
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
對(duì)視圖的不當(dāng)DML操作會(huì)污染基表數(shù)據(jù)
即:對(duì)視圖進(jìn)行DML操作后,視圖對(duì)基礎(chǔ)表對(duì)應(yīng)數(shù)據(jù)進(jìn)行該DML操作揭糕,但是操作后視圖卻對(duì)該記錄不可見萝快。
INSERT INTO v_emp_10(id,name,salary,deptno) VALUES(1001,'JACK',3000,20)
UPDATE v_emp_10 SET deptno=20
DELETE不會(huì)產(chǎn)生污染現(xiàn)象。
DELETE FROM v_emp_10 WHERE deptno=20
為視圖添加檢查選項(xiàng)著角,可以避免對(duì)視圖操作而導(dǎo)致的對(duì)基表的數(shù)據(jù)污染揪漩。
WITH CHECK OPTION
該選項(xiàng)要求對(duì)視圖進(jìn)行DML操作后,該記錄必須對(duì)視圖可見吏口。
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
只讀選項(xiàng)
只讀選項(xiàng)要求對(duì)視圖僅能進(jìn)行查詢操作奄容,不能進(jìn)行任何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ù)庫(kù)的數(shù)據(jù)字典
USER_OBJECTS:記錄用戶創(chuàng)建過的所有數(shù)據(jù)庫(kù)對(duì)象
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)建復(fù)雜視圖
創(chuàng)建一張視圖产徊,包含員工工資及相關(guān)部門信息
包含:每個(gè)部門的平均工資昂勒,最大,最小囚痴,工資總和叁怪,以及對(duì)應(yīng)的部門名稱,部門編號(hào)深滚。
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ù)庫(kù)對(duì)象之一奕谭,作用是根據(jù)指定的規(guī)則生成一系列數(shù)字。通常使用序列生成的
數(shù)字是為表中的主鍵字段提供值使用痴荐。
CREATE SEQUENCE seq_emp_id START WITH 1 INCREMENT BY 1
序列支持兩個(gè)偽列:
NEXTVAL:獲取序列的下一個(gè)數(shù)字血柳,如果是新創(chuàng)建的序列,那么會(huì)從START WITH開始返回生兆。
之后則是用上次生成的數(shù)字加上步長(zhǎng)來得到本次生成的數(shù)字返回难捌。
需要注意膝宁,序列是不能后退的。并且不受事務(wù)控制根吁。
CURRVAL:獲取序列最后生成的數(shù)字员淫,新創(chuàng)建的序列至少調(diào)用NEXTVAL生成一個(gè)數(shù)字后才可以使用。CURRVAL不會(huì)導(dǎo)致序列步進(jìn)击敌。
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
刪除一個(gè)序列
DROP SEQUENCE seq_emp_id
序列的數(shù)據(jù)字典
SELECT * FROM USER_SEQUENCES
索引INDEX
索引是數(shù)據(jù)庫(kù)對(duì)象之一介返,作用是提高查詢效率
索引的創(chuàng)建時(shí)是數(shù)據(jù)庫(kù)自行完成的,并且數(shù)據(jù)庫(kù)會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)使用索引沃斤。
CREATE INDEX idx_emp_ename ON emp(ename)
經(jīng)常出現(xiàn)在WHERE中和ORDER BY中的字段要添加索引圣蝎。經(jīng)常出現(xiàn)在DISTINCT后面的字段也可以添加索引。
需要注意衡瓶,對(duì)于字符串類型字段徘公,若在WHERE中使用LIKE進(jìn)行過濾時(shí),是不會(huì)用到索引的哮针。
約束
非空約束
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)
測(cè)試
INSERT INTO employees2
(eid,name,email)
VALUES
(NULL,'jack',NULL)
SELECT * FROM employees2
主鍵約束
一張表只能有一個(gè)字段定義主鍵約束关面,主鍵約束要求該字段非空且唯一
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);
測(cè)試
INSERT INTO employees3
(eid,name,email)
VALUES
(2,'jack','jack@123.com')
外鍵約束
外鍵約束條件定義在兩個(gè)表的字段或一個(gè)表的兩個(gè)字段上,用于保證相關(guān)兩個(gè)字段的關(guān)系十厢。比如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);
外鍵約束條件包括兩個(gè)方面的數(shù)據(jù)約束:
從表上定義的外鍵的列值,必須從主表被參照的列值中選取辛燥,或者為NULL筛武;
當(dāng)主表參照列的值被從表參照時(shí),主表的該行記錄不允許被刪除挎塌。
檢查約束
ALTER TABLE employees4 ADD CONSTRAINT employees4_salary_check CHECK(salary>2000);