檢視是什麼玩意

韋大仙發表於2018-05-20

《採桑子·重陽》

人生易老天難老,歲歲重陽。
今又重陽,戰地黃花分外香。
一年一度秋風勁,不似春光,
勝似春光,寥廓江天萬里霜

檢視:是儲存在資料庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 檢視可以隱藏一些資料,如:社會保險基金錶,可以用檢視只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使複雜的查詢易於理解和使用。這個檢視就像一個“視窗”,從中只能看到你想看的資料列。這意味著你可以在這個檢視上使用SELECT *,而你看到的將是你在檢視定義裡給出的那些資料列:
1、 檢視能簡化使用者操作
2、 檢視使使用者能以多種角度看待同一資料
3、 檢視對重構資料庫提供了一定程度的邏輯獨立性
4、檢視能夠對機密資料提供安全保護
5、適當的利用檢視可以更清晰地表達查詢

1.員工表
CREATE TABLE t_employee(
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(30) NOT NULL,
SEX CHAR(2) NOT NULL,
AGE INT NOT NULL,
DEPARTMENT VARCHAR(10) NOT NULL,
SALARY INT NOT NULL,
HOME VARCHAR(30),
MARRY CHAR(2) NOT NULL DEFAULT `否`,
HOBBY VARCHAR(30)
);

INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`小紅`,`女`,20,`人事部`,`4000`,`廣東`,`否`,`網球`);
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`明日`,`女`,21,`人事部`,`9000`,`北京`,`否`,`網球`);
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`天天`,`男`,22,`研發部`,`8000`,`上海`,`否`,`音樂`);
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`大大`,`女`,23,`研發部`,`9000`,`重慶`,`否`,`無`);
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`王下`,`女`,24,`研發部`,`9000`,`四川`,`是`,`足球`);
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`無名`,`男`,25,`銷售部`,`6000`,`福建`,`否`,`遊戲`);
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,`不知道`,`女`,26,`銷售部`,`5000`,`山西`,`否`,`籃球`);

然後再定義一張員工資訊表:
CREATE TABLE t_employee_detail(ID INT PRIMARY KEY AUTO_INCREMENT,POS VARCHAR(20) NOT NULL,EXPERENCE VARCHAR(20) NOT NULL);

INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(1,`人事管理`,`工作二年`);
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(2,`人事招聘`,`工作二年`);
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(3,`初級工程師`,`工作一年`);
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(4,`中級工程師`,`工作二年`);
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(5,`高階工程師`,`工作三年`);
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(6,`銷售代表`,`工作二年`);
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(7,`銷售員`,`工作一年`);

CREATE [OR REPLACE] VIEW [db_name.]view_name [(column_list)] AS select_statement
在建立檢視前應先看看是否有許可權:
SELECT SELECT_priv,create_view_priv from mysql.user WHERE user=`root`

2、單表上建立檢視
在員工表是建立檢視
CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE,DEPARTMENT) AS SELECT ID, NAME, SEX, AGE,DEPARTMENT FROM learning.t_employee;
然後是顯示內容:
SELECT * FROM V_VIEW1

3、多表上建立檢視
CREATE VIEW V_VIEW2(ID, NAME, SEX, AGE,DEPARTMENT,POS,EXPERENCE) AS SELECT a.ID, a.NAME, a.SEX, a.AGE,a.DEPARTMENT,b.POS,b.EXPERENCE FROM learning.t_employee a,learning.t_employee_detail b WHERE a.ID=b.ID;

SELECT * FROM V_VIEW2

4、檢視檢視

(1)DESCRIBE 命令
DESCRIBE V_VIEW2

(2)SHOW TABLE STATUS
show TABLE status LIKE `V_VIEW2`

(3)SHOW CREATE view命令
show CREATE view V_VIEW2

5、修改檢視
(1)CREATE OR REPLACE命令
CREATE OR REPLACE VIEW V_VIEW1(ID, NAME, SEX) AS SELECT ID, NAME, SEX FROM learning.t_employee;

(2) ALTER 命令
ALTER VIEW V_VIEW1(ID, NAME) AS SELECT ID, NAME FROM learning.t_employee;
SELECT * FROM learning.v_view1

6、更新檢視
在MySQL中,更新檢視是指通過檢視來插入(INSERT)、更新(UPDATE)和刪除(DELETE)表中的資料。因為檢視是一個虛擬表,其中沒有資料,所以通過檢視更新時,都是轉換到基本表來更新。
更新檢視時,只能更新許可權範圍內的資料。超出了範圍,就不能更新。

UPDATE V_VIEW2 SET POS=`高階工程師` WHERE NAME=`天天`

對應的真實表上的資料也發生改變了
SELECT * FROM learning.t_employee_detail WHERE t_employee_detail.ID=3

不可更新的檢視:
某些檢視是可更新的。也就是說,可以在諸如UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對於可更新的檢視,在檢視中的行和基表中的行之間必須具有一對一的關係。還有一些特定的其他結構,這類結構會使得檢視不可更新。更具體地講,如果檢視包含下述結構中的任何一種,那麼它就是不可更新的:

• 聚合函式(SUM(), MIN(), MAX(), COUNT()等)。
• DISTINCT
• GROUP BY
• HAVING
• UNION或UNION ALL
• 位於選擇列表中的子查詢
• Join
• FROM子句中的不可更新檢視
• WHERE子句中的子查詢,引用FROM子句中的表。
• 僅引用文字值(在該情況下,沒有要更新的基本表)。
• ALGORITHM = TEMPTABLE(使用臨時表總會使檢視成為不可更新的)。

注意

檢視中雖然可以更新資料,但是有很多的限制。一般情況下,最好將檢視作為查詢資料的虛擬表,而不要通過檢視更新資料。因為,使用檢視更新資料時,如果沒有全面考慮在檢視中更新資料的限制,就可能會造成資料更新失敗。

7、刪除檢視

DROP VIEW IF EXISTS 檢視名

相關文章