《採桑子·重陽》 人生易老天難老,歲歲重陽。 今又重陽,戰地黃花分外香。 一年一度秋風勁,不似春光, 勝似春光,寥廓江天萬里霜 視圖:是存儲在資料庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金錶,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數 ...
《採桑子·重陽》
人生易老天難老,歲歲重陽。
今又重陽,戰地黃花分外香。
一年一度秋風勁,不似春光,
勝似春光,寥廓江天萬里霜
視圖:是存儲在資料庫中的查詢的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 視圖名