目錄
?1.視圖的含義與作用
2.視圖的創建與查看
1.創建視圖的語法形式
2、查看視圖:
1.使用DESCRIBE語句查看視圖基本信息
2.使用SHOW TABLE STATUS語查看視圖基本信息查看視圖的信息
3.使用SHOW CREATE VIEW語查看視圖詳細信息
4.在views表中查看視圖詳細信息
3.視圖的修改與更新
1.使用CREATE OR REPLACE VIEW語句修改視圖MYSQL中如果要修改視圖
2.使用ALTER語修改視圖
1、使用UPDATE語句更新視圖view_t,
2、使用INSERT語句在基本表t中插入一條記錄
3、使用DELETE語刪除視圖view_t2中的一條記錄,
4.刪除視圖:
5.練習題
?1.視圖的含義與作用
數據庫中的視圖是一個虛擬表。同真實的表一樣,視圖包含一系列帶有名稱的行和列數據。
行和列數據來自由定義視圖查詢所引用的表,并且在引用視圖時動態生成。
在視圖中用戶可以使用SELECT語查詢數據,以及使用INSERT、UPDATE和DELETE修改記錄。
從MySOL 5.0開始可以使用視圖,視圖可以使用戶操作方便,而且可以保障數據庫系統的安全。
視圖的含義:
視圖一經定義便存儲在數據庫中,與其相對應的數據并沒有像表那樣在數據庫中再存儲一份,
通過視圖看到的數據只是存放在基本表中的數據。對視圖的操作與對表的操作一樣,可以
對其進行查詢、修改和刪除。當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化;同時,若基本表的數據發生變化,則這種變化也可以自動地反映到視圖中。
下面有個student表和stu_info表,在student 表中包含了學生的id 號和姓名,stu_info
表中包含了學生的id 號、班級和家庭住址,而現在公布分班信息,只需要id 號、姓名和班
級,這該如何解決?通過學習后面的內容就可以找到完美的解決方案。
表設計如下:
CREATE TABLE student
( s_id INT, name VARCHAR(40)
);
CREATE TABLE stu_info
( s_id INT,
glass VARCHAR(40), addr VARCHAR(90)
);
通過 DESC 命令可以查看表的設計,可以獲得字段、字段的定義、是否為主鍵、是否
為默認值和擴展信息。
視圖提供了一個很好的解決方法,創建視圖的信息來自表的部分信息,只取需要的信息。
這樣既能滿足要求也不破壞表原來的結構。
視圖的作用:
與直接從數據表中讀取相比,視圖有以下優點:
1.簡單化
看到的就是需要的。視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件
2.安全性
通過視圖用戶只能查詢和修改他們所能見到的數據。數據庫中的其他數據則既看不見
也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,
但不能授權到數據庫特定行和特定的列上。通過視圖,用戶可以被限制在數據的不同
子集上:
(1)使用權限可被限制在基表的行的子集上。
(2)使用權限可被限制在基表的列的子集上。
(3)使用權限可被限制在基表的行和列的子集上。
(4)使用權限可被限制在多個基表的連接所限定的行上。
(5)使用權限可被限制在基表中的數據的統計匯總上。
(6)使用權限可被限制在另一視圖的一個子集上,或是一些視圖和基表合并后的子集上
3.邏輯數據獨立性
視圖可幫助用戶屏蔽真實表結構變化帶來的影響。
2.視圖的創建與查看
1.創建視圖的語法形式
創建視圖使用CREATE VIEW語句,基本語法格式如下:
CREATE [OR REPLACE] [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLEI]
VIEW view_name [ (column list)]
AS SELECT_statement
[ WITH [CASCADED | LOCAL ] CHECK OPTION]
其中,CREATE表示創建新的視圖,REPLACE表示替換已經創建的視圖:
ALGORITHM表示視圖選擇的算法;view_name 為視圖的名稱,
column_list 為屬性列;SELECT_statement表示SELECT語句
WITH [CASCADED | LOCAL] CHECK OPTION 參數表示視圖在更新時保證在視圖的權限
范圍之內。
ALGORITHM的取值有3個分別是UNDEFINED|MERGE | TEMPTABLE ,UNDEFINED表示
MySOL將 自動選擇算法:MERGE表示將使用的視圖語句與視圖定義合并起來,使得視圖定義的某 一部分取代語句對應的部分;TEMPTABLE 表示將視圖的結果存入臨時表,然后用臨時表來執行語句。
CASCADED與LOCAL 為可選參數,CASCADED 為默認值,表示更新視圖時要滿足所有
相關視圖和表的條件;
LOCAL表示更新視圖時滿足該視圖本身定義的條件即可。該語句要求具有針對視圖的
CREATE VIEW權限,以及針對由SELECT語選擇的每一列上的某些權限。對于在SELECT 語句中其他地方使用的列,必須具有SELECT 權限。如果還有ORREPLACE子句,必須在視圖上具有DROP權限。
視圖屬于數據庫。在默認情況下,將在當前數據庫創建新視圖。要想在給定數據庫中明確創建視圖,
創建時應將名稱指定為db_name.view_name。
在單表上創建視圖,MySQL可以在單個數據表上創建視圖.
舉例:
在t表格上創建一個名為view_t的視圖,代碼如下:
create table t (qty int, price int); /*創建基本表t*/
insert into t values(3, 50); /*插入記錄*/
create view view_t as select qty, price, qty *price from t; /*創建視圖view_t*/
select * from view_t;
默認情況下創建的視圖和基本表的字段是一樣的 也可以通過指定視圖字段的名稱來創建視圖。
舉例2:在t表格上創建一個名為view_t2的視圖,代碼如下:
create view view_t2(qty, price, total ) as select qty, price, qty *price from t;
select * from view_t2;
可以看到,view_t2和view_t兩個視圖中字段名稱不同,但數據卻是相同的。
因此,在使用視圖的時候,可能用戶根本就不需要了解基本表的結構,更接觸不到實際表中的數據,從而保證了數據庫的安全。
在多表上創建視圖 MySOL中也可以在兩個或者兩個以上的表上創建視圖可以使用CREATE VIEW語句實 現.
舉例:
在表student和表stu_info上創建視圖stu_glass,代碼如下:
create table student(
id int,
name char(50)
);create table stu_info(
id int,
glass char(50),
place char(50)
);insert into student values(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai');
insert into stu_info values(1, 'wuban','henan'),(2,'liuban','hebei'), (3,'qiban','shandong');
create view stu_glass (id,name, glass)
as select student.id,student.name,stu_info.glass from student,stu_info
where student.id=stu_info.id;
select * from stu_glass;
這個例子就解決了剛開始提出的那個問題,通過這個視圖可以很好地保護基本表中的
數據。
這個視圖中的信息很簡單,只包含了id、姓名和班級,id 字段對應student 表中的s_id
字段,
name字段對應student 表中的name 字段,glass字段對應stu_info表中的glass 字段。
2、查看視圖:
查看視圖是查看數據庫中已存在的視圖的定義。查看視圖必須要有 SHOW VIEW的權
限MySQL
數據庫下的 user 表中保存著這個信息。查看視圖的方法包括:DESCRIBE、SHOW
TABLE STATUS和SHOW CREATE VIEW,本節將介紹查看視圖的各種方法。
1.使用DESCRIBE語句查看視圖基本信息
DESCRIBE可以用來查看視圖,具體的語法如下:
DESCRIBE 視圖名;
舉例:通過DESCRIBE語句查看視圖view_t的定義,代碼如下:
describe view_t;
結果顯示出了視圖的字段定義、字段的數據類型、是否為空、是否為主/外鍵、默認值
和額外信息。
DESCRIBE一般情況下都簡寫成DESC,輸入這個命的執行結果和輸入DESCRIBE的執行
結果是一樣的。
2.使用SHOW TABLE STATUS語查看視圖基本信息查看視圖的信息
可以通過SHOW TABLE STATUS 的方法,具體的語法如下:
SHOW TABLE STATUS LIKE ‘視圖名’
下面將通過一個例子來學習使用SHOW TABLE STATUS命令查看視圖信息,代碼如下:
show table status like 'view_t' \G;
show table status like 't' \G;
執行結果顯示,表的說明Comment 的值為 VIEW說明該表為視圖,其他的信息為NULI
說明這是一個虛表。
用同樣的語句來查看一下數據表t的信息,從查詢的結果來看,這里的信息包含了存儲引擎、創建時間等,
Comment 信息為空,這就是視圖和表的區別。
3.使用SHOW CREATE VIEW語查看視圖詳細信息
使用SHOW CREATE VIEW語可以查看視圖詳細定義,語法如下:
SHOW CREATE VIEW 視圖名 ;
舉例:SHOW CREATE VIEW查看視圖的詳細定義,代碼如下:
show create view view_t \G;
執行結果顯示視圖的名稱、創建視圖的語句等信息。
4.在views表中查看視圖詳細信息
在MySOL中,information_schema數據庫下的views 表中存儲了所有視圖的定義。
通過對 views表的查詢,可以查看數據庫中所有視圖的詳細信息,查詢語句如下:
select * from information_schema.views \G;
查詢的結果顯示當前以及定義的所有視圖的詳細信息,在這里也可以看到前面定義的
3個名稱為stuglass、viewt和view t2視圖的詳細信息。
3.視圖的修改與更新
修改視圖是指修改數據庫中存在的視圖,當基本表的某些字段發生變化的時候,
可以通過修改視圖來保持與基本表的一致性。
MySOL 中通過CREATE OR REPLACE VIEW語和ALTER語句來修改視圖。
1.使用CREATE OR REPLACE VIEW語句修改視圖MYSQL中如果要修改視圖
語法如下 :
CREATE [ OR REPLACE ] (ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL ] CHECK OPTION ]
可以看到,修改視圖的語句和創建視圖的語句是完全一樣的。當視圖已經存在時,
修改語句對視圖進行修改;當視圖不存在時,創建視圖。下面通過一個實例來說明。
修改視圖view_t,代碼如下:
desc view_t;
create or replace view view_t as select * from t;
desc view_t;
從執行的結果來看。相比原來的視圖 view_t,新的視圖 view_t少了1行數據。
2.使用ALTER語修改視圖
ALTER語句是MySOL提供的另外一種修改視圖的方法,語法如下:
ALTER [ ALGORITHM = { UNDEFINED | MERGE | EPTABLE}]
TVIEW view_name[(column list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
這個語法中的關鍵字和前面視圖的關鍵字是一樣的,這里就不再介紹
具體操作舉例:
使用ALTER語句修改視圖view_t,代碼如下:
desc view_t;
alter view view_t as select quantity from t;
desc view_t;
通過ALTER語句同樣可以達到修改視圖 view_t的目的,
從上面的執行過程來看,視圖viewt只剩下1個qty字段,修改成功。
更新視圖:
更新視圖是指通過視圖來插入、更新、刪除表中的數據,因為視圖是一個虛擬表,
其中沒有數據。通過視圖更新的時候都是轉到基本表上進行更新的,
如果對視圖增加或者刪除記錄,實際上是對其基本表增加或者刪除記錄。
本節將介紹視圖更新的3種方法:INSERT UPDATE和 DELETE。
1、使用UPDATE語句更新視圖view_t,
代碼如下:
select * from view_t; /*查看更新之前的視圖*/
select * from t; /*查看更新之前的表*/
update view_t set qty=5; /*更新視圖*/
select * from t; /*查看更新之后的表*/
select * from view_t; /*查看更新之后的視圖*/
select * from view_t2;
對視圖view_t更新后,基本表t的內容也更新了,
同樣當對基本表t更新后,另外一個視圖view_t2中的內容也會更新。
2、使用INSERT語句在基本表t中插入一條記錄
代碼如下:
insert into t values(3,5);
select * from t;
select * from view_t2;
向表t中插入一條記錄,通過SELECT 查看表t和視圖 view_t2,可以看到其中的內容也
跟著更新,
視圖更新的不僅僅是數量和單價,總價也會更新。
3、使用DELETE語刪除視圖view_t2中的一條記錄,
代碼如下
delete from view_t2 where price=5;
DELETE FROM view_t2 WHERE price=5;
執行結果如下:
在視圖view_t2中刪除price=5的記錄,視圖中的刪除操作最終是通過刪除基本表中相
關的記錄實現的,
查看刪除操作之后的表 t和視圖 view_t2,可以看到通過視圖刪除其所依賴的基本表中
的數據。
當視圖中包含有如下內容時,視圖的更新操作將不能被執行:
(1)視圖中不包含基表中被定義為非空的列。
(2)在定義視圖的SELECT語后的字段列表中使用了數學表達式。
(3)在定義視圖的SELECT語句后的字段列表中使用聚合函數
(4)在定義視圖的SELECT 語中使用了 DISTINCT,UNION,TOP,GROUP BY HAVING子句。
4.刪除視圖:
當視圖不再需要時,可以將其刪除,刪除一個或多個視圖可以使用 DROP VIEW 語
句,語法如下:
DROP VIEW [IF EXISTS]
view_name[,view_name]
[RESTRICT | CASCADE]
其中,view_name是要刪除的視圖名稱,可以添加多個需要刪除的視圖名稱,
各個名稱之間使用逗號分隔開。刪除視圖必須擁有DROP權限。
restrict和casecade都是數據庫外鍵約束,但它們之間存在一定的區別:
restrict是不允許刪除或更新一條記錄,而casecade則是在刪除或更新一條記錄時,
會同時刪除或更新所有引用該記錄的外鍵。
舉例:刪除stu_glass視圖,代碼如下:
drop view if exists stu_glass;
show create view stu_glass;
5.練習題
注意事項:
疑問:MySQL中視圖和表的區別以及聯系是什么?
1.兩者的區別
(1)視圖是已經編譯好的SOL語句,是基于SOL語的結果集的可視化的表,而表不是
(2)視圖沒有實際的物理記錄,而表有。
(3)表是內容,視圖是窗口。
(4)表占用物理空間而視圖不占用物理空間,視圖只是邏輯概念的存在,表可以及時對
它進行修改,
但視圖只能用創建的語句來修改。
(5)視圖是查看數據表的一種方法,可以查詢數據表中某些字段構成的數據,
只是一些 SQL語句的集合。從安全的角度來說,視圖可以防止用戶接觸數據表。
(6)表屬于全局模式中的表,是實表:視圖屬于局部模式的表,是虛表。
(7)視圖的建立和刪除只影響視圖本身,不影響對應的基本表。
2.兩者的聯系
視圖(view)是在基本表之上建立的表,它的結構(即所定的列)和內容(即所有記錄)都來
自基本表,
它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。
視圖是基本表的抽象和在邏輯意義上建立的新關系。
練習題:
(1)如何在一個表上創建視圖?
create table ts (qty int, price int); /*創建基本表ts*/
insert into ts values(4, 32); /*插入記錄*/
create view view_ts as select qty,price,qty*price from ts;/*創建視圖view_ts*/
select * from view_ts; /*查看視圖 作用是 減少輸入操作*/
默認情況下創建的視圖和基本表的字段是一樣的 也可以通過指定視圖字段的名稱來創
建視圖。
create view view_ts1(qty,price,total) as select qty,price,qty * price from ts;select * from view_ts1;
(2)如何在多個表上建立視圖?
create table student(
id int,
name char(50)
);create table stu_info(
id int,
glass char(50),
place char(50)
);insert into student values(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai');
insert into stu_info values(1, 'wuban','henan'),(2,'liuban','hebei'), (3,'qiban','shandong');
create view stu_glass (id,name, glass)
as select student.id,student.name,stu_info.glass from student,stu_info
where student.id=stu_info.id;
select * from stu_glass;
(3)如何更改視圖?
方法一
create or replace view stu_v_1 as select id,name,age from student where id <= 10;
方法二
alter view stu_v_1 select id,name from student ;
(4)如何去查看視圖的詳細信息?
1.使用DESCRIBE語句查看視圖基本信息
describe view_t;
2.使用SHOW TABLE STATUS語查看視圖基本信息查看視圖的信息
show table status like 'view_t' \G;
3.使用SHOW CREATE VIEW語查看視圖詳細信息
show create view view_t \G;
4.在views表中查看視圖詳細信息
select * from information_schema.views \G;
(5)如何更新視圖的內容?
select * from view_t; /*查看更新之前的視圖*/
select * from t; /*查看更新之前的表*/
update view_t set qty=5; /*更新視圖*/
select * from t; /*查看更新之后的表*/
select * from view_t; /*查看更新之后的視圖*/
select * from view_t2;
表結構
/*員工人事表*/
create table employee (emp_no char(5) Not null primary key check (emp_no LIKE 'E%' AND LEN(emp_no)=5),emp_name varchar(10) Not null,sex char(2) Not null check(sex IN('M','F')),dept varchar(4) Not null,title varchar(6) Not null,date_hired datetime Not null,birthday datetime Null,salary int Not null,addr varchar(50) null
);
/*客戶表*/
create table customer(cust_id char(5) Not null primary key,cust_name varchar(20) Not null, addr varchar(40) Not null, tel_no varchar(10) Not null, zip char(6) null
);/*銷售主表*/
create table sales( order_no int Not null primary key,cust_id char(5) Not null,sale_id char(5) Not null,tot_amt numeric(9,2) Not null, order_date datetime Not null,ship_date datetime Not null,invoice_no char(10) UNIQUE
);/*銷貨明細表*/
create table sale_item(order_no int Not null,prod_id char(5) Not null,qty int Not null,unit_price numeric(7,2) Not null,order_date datetime null
);
alter table sale_item add primary key(order_no,prod_id); /*產品名稱表*/
create table product(prod_id char(5) Not null primary key,prod_name varchar(20) Not null
);
1、利用存儲過程,給Employee表添加一條業務部門員工的信息。
2、利用存儲過程輸出所有客戶姓名、客戶訂購金額及其相應業務員的姓名。
3、利用存儲過程查找某員工的員工編號、訂單編號、銷售金額。
4、編寫存儲過程完成插入一條員工記錄,判斷員工編號是否存在。