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

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

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

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

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容