NO.47 視圖、序列、索引 、 約束

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

emp測試用表

視圖VIEW

視圖是數(shù)據(jù)庫對象之一,在SQL語句中體現(xiàn)的角色與表一致。但是視圖并非一張真實(shí)存在的表,它只是一個(gè)查詢語句對應(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

視圖對應(yīng)的子查詢中的字段可以指定別名,這樣該視圖對應(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ù)對應(yīng)的子查詢不同,分為簡單視圖和復(fù)雜視圖

簡單視圖:對應(yīng)的子查詢不含有函數(shù),表達(dá)式,分組,去重,關(guān)聯(lián)查詢。

除了簡單視圖就是復(fù)雜視圖

簡單視圖可以進(jìn)行DML操作,對該視圖的操作就是對該視圖數(shù)據(jù)來源的基礎(chǔ)表進(jìn)行的操作。

復(fù)雜視圖不允許進(jìn)行DML操作。

對簡單視圖進(jìn)行DML操作也不能違反基礎(chǔ)表的約束條件。

對視圖進(jìn)行DML操作,視圖對基礎(chǔ)表操作時(shí),只能對視圖可見的字段進(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

對視圖的不當(dāng)DML操作會污染基表數(shù)據(jù)

即:對視圖進(jìn)行DML操作后,視圖對基礎(chǔ)表對應(yīng)數(shù)據(jù)進(jìn)行該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

為視圖添加檢查選項(xiàng),可以避免對視圖操作而導(dǎo)致的對基表的數(shù)據(jù)污染。

WITH CHECK OPTION

該選項(xiàng)要求對視圖進(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 CHECK OPTION

WITH READ ONLY

只讀選項(xiàng)

只讀選項(xiàng)要求對視圖僅能進(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ù)庫的數(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)建復(fù)雜視圖

創(chuàng)建一張視圖,包含員工工資及相關(guān)部門信息

包含:每個(gè)部門的平均工資,最大,最小,工資總和,以及對應(yī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

序列支持兩個(gè)偽列:

NEXTVAL:獲取序列的下一個(gè)數(shù)字,如果是新創(chuàng)建的序列,那么會從START WITH開始返回。

之后則是用上次生成的數(shù)字加上步長來得到本次生成的數(shù)字返回。

需要注意,序列是不能后退的。并且不受事務(wù)控制。

CURRVAL:獲取序列最后生成的數(shù)字,新創(chuàng)建的序列至少調(diào)用NEXTVAL生成一個(gè)數(shù)字后才可以使用。CURRVAL不會導(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ù)庫對象之一,作用是提高查詢效率

索引的創(chuàng)建時(shí)是數(shù)據(jù)庫自行完成的,并且數(shù)據(jù)庫會在適當(dāng)?shù)臅r(shí)候自動使用索引。

CREATE INDEX idx_emp_ename ON emp(ename)

經(jīng)常出現(xiàn)在WHERE中和ORDER BY中的字段要添加索引。經(jīng)常出現(xiàn)在DISTINCT后面的字段也可以添加索引。

需要注意,對于字符串類型字段,若在WHERE中使用LIKE進(jìn)行過濾時(shí),是不會用到索引的。

約束

非空約束

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

主鍵約束

一張表只能有一個(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);

測試

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);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.簡介 數(shù)據(jù)存儲有哪些方式?電子表格,紙質(zhì)文件,數(shù)據(jù)庫。 那么究竟什么是關(guān)系型數(shù)據(jù)庫? 目前對數(shù)據(jù)庫的分類主要是...
    喬震閱讀 2,035評論 0 2
  • 5.多表查詢 多表查詢 目的:從多張表獲取數(shù)據(jù) 前提:進(jìn)行連接的多張表中有共同的列 等連接 通過兩個(gè)表具有相同意義...
    喬震閱讀 1,552評論 0 0
  • 數(shù)據(jù)庫概述: 數(shù)據(jù)庫(DataBase,DB):指長期保存在計(jì)算機(jī)的存儲設(shè)備上,按照一定規(guī)則組織起來,可以被各種用...
    字節(jié)碼閱讀 649評論 0 0
  • mysql數(shù)據(jù)庫中 :database : 文件夾table : 數(shù)據(jù)表(數(shù)據(jù)文件) 進(jìn)入mysqlmysql -...
    賦閑閱讀 644評論 0 0
  • 終于熬到放假了,手機(jī)關(guān)機(jī),睡了幾天懶覺,頓時(shí)感覺腦袋都輕飄了許多。 出門覓食去,想吃的吃飽了肚,感覺前所未有的舒服...
    清清霧閱讀 259評論 0 0

友情鏈接更多精彩內(nèi)容