溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mysql之數(shù)據(jù)庫視圖

發(fā)布時間:2020-07-15 12:21:43 來源:網(wǎng)絡 閱讀:647 作者:一葉扁舟丶 欄目:MySQL數(shù)據(jù)庫

Mysql之數(shù)據(jù)庫視圖

        數(shù)據(jù)庫中的視圖是一個虛擬表。同真實表一樣,包含行和列數(shù)據(jù),行和列的數(shù)據(jù)來自 定義視圖查詢所引用的表,并且在引用視圖時動態(tài)生成??梢愿綦x用戶與數(shù)據(jù)保持安全,且快速查詢數(shù)據(jù)。

        Mysql5.0后版本支持視圖,可以使用select、insert into、update、delete等。無論修改基本表還是視圖都對應發(fā)生變化。

視圖的作用:

比直接從數(shù)據(jù)表中讀取相比:

1、簡化了:看到的就是需要的。

2、安全性:通過視圖用戶只能查詢和修改他們所能看到的數(shù)據(jù)。其他數(shù)據(jù)看不到也取不到。

3、邏輯數(shù)據(jù)獨立性:視圖可以幫助用戶屏蔽真實表結(jié)構(gòu)變化帶來的影響。


創(chuàng)建視圖:

視圖包含了select查詢的結(jié)果,因此視圖的創(chuàng)建基于select語句和已存在的數(shù)據(jù)表,視圖可以建立在一張表上,也可以建立在多張表上。

語法:

create [or replace] [algorithm = {undefined | merge | temptable }]
view view_name [(column_list)]
as select_statment
[with [cascaded | local] check option]
create    # 創(chuàng)建視圖
replace   # 替換視圖
algorithm  # 視圖算法:undefined系統(tǒng)自己選擇算法;merge表示視圖語句與視圖定義合并,使視圖定義部分替代語句對應部分;temptable表示將視圖結(jié)果存入臨時表,用臨時表來執(zhí)行語句。
view_name  # 視圖名稱
column_list     # 屬性列
select_statment   # select語句
[with [cascaded | local] check option]    # 表示權(quán)限范圍之內(nèi):cascaded表示滿足所有條件。local表示更新時滿足視圖本身條件即可。

單表創(chuàng)建視圖:

mysql> create database view;
mysql> use view;
mysql> create table t (quantity INT,price INT);
mysql> insert into t values(3,50);
mysql> create view view_t as select quantity,price,quantity * price from t;
mysql> select * from view_t;

# 默認情況下創(chuàng)建的視圖和基本表的字段一樣,也可以通過指定視圖字段的名稱來創(chuàng)建視圖。

mysql> create view view_t2(qty,price,total) as select quantity,price,quantity * price from t;
mysql> select * from view_t2;

# view_t和view_t2兩個視圖中的字段名稱不同,但是數(shù)據(jù)卻是相同的。因此在使用視圖的時候,可能用戶根本就不需要了解表的機構(gòu),更接觸不到實際表中的數(shù)據(jù),從而保證了數(shù)據(jù)庫的安全。

在多表上創(chuàng)建視圖:

mysql> create database stud;
mysql> use stud;
mysql> create table student (id int,name char(20));
mysql> create table stu_info (id int,name char(20),addr char(20));
mysql> show tables;
mysql> insert into student values(1,'zhouyi'),(2,'zhaoer'),(3,'zhangsan');
mysql> insert into student values(1,'zhouyi','beijing'),(2,'zhaoer','shanghai'),(3,'zhangsan','chengdu');
mysql> select * from stu_info;
mysql> select * from student;
mysql> create view stu_glass(id,name,glass) as select student.id,student.name,stu_info.addr from student,stu_info where student.id=stu_info.id;
mysql> select * from stu_glass;

# 可以看出視圖id是student.id

# name是student.name

# glass是stu_info.addr

查看視圖:

mysql> show table status like 'stu_glass'\G;    # 全是NULL,Comment: VIEW表示虛表
mysql> desc stu_glass;    # 查看視圖基本信息
mysql> show create view stu_glass\G;     # 查看視圖創(chuàng)建信息
mysql> select * from information_schema.views\G;    # 查看詳細信息

修改視圖:

mysql> use view;
mysql> desc view_t;
mysql> alter view view_t as select quantity from t;

或者:
mysql> create or replace view view_t as select * from t;
mysql> desc view_t;


更新視圖:

mysql> alter view view_t as select quantity from t;  # 修改視圖和元數(shù)據(jù)不同
mysql> select * from view_t;
mysql> select * from t;
mysql> update view_t set quantity=5;
mysql> select * from view_t;
mysql> select * from view_t2;
mysql> select * from t;
# 全部更新

插入數(shù)據(jù):

mysql> insert into t values (3,5);    # 插入數(shù)據(jù)
mysql> select * from view_t;
mysql> select * from view_t2;
mysql> select * from t;        # 全部插入


mysql> delete from view_t2 where price=5;	# 刪除view_t2視圖中price=5的數(shù)據(jù);
mysql> select * from view_t2;
mysql> select * from t;
# 在view_t2中刪除price=5的操作最終是通過基本表中的相關記錄實現(xiàn)的。
注意:
當視圖中包含有如下內(nèi)容時,視圖的更新操作將不被執(zhí)行:
1、視圖中不包含基本表中被定義為非空的列;
2、在定義視圖的select語句后的字段列表中使用數(shù)學表達式;
3、在定義視圖的select語句后的字段列表中使用了聚合函數(shù);
4、在定義視圖的select語句中使用了distinct、union、top、group、having子句。


刪除視圖:

mysql> drop view if exists view_t2;
mysql> show create view view_t2; 
ERROR 1146 (42S02): Table 'view.view_t2' doesn't exist


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI