Mysql之數據庫視圖
阿新 • • 發佈:2018-08-07
所有 shanghai ase 影響 不同 自己 mysql esc 實現 Mysql之數據庫視圖
數據庫中的視圖是一個虛擬表。同真實表一樣,包含行和列數據,行和列的數據來自 定義視圖查詢所引用的表,並且在引用視圖時動態生成。可以隔離用戶與數據保持安全,且快速查詢數據。
Mysql5.0後版本支持視圖,可以使用select、insert into、update、delete等。無論修改基本表還是視圖都對應發生變化。
視圖的作用:
比直接從數據表中讀取相比:
1、簡化了:看到的就是需要的。
2、安全性:通過視圖用戶只能查詢和修改他們所能看到的數據。其他數據看不到也取不到。
3、邏輯數據獨立性:視圖可以幫助用戶屏蔽真實表結構變化帶來的影響。
創建視圖:
視圖包含了select查詢的結果,因此視圖的創建基於select語句和已存在的數據表,視圖可以建立在一張表上,也可以建立在多張表上。
語法:
create [or replace] [algorithm = {undefined | merge | temptable }] view view_name [(column_list)] as select_statment [with [cascaded | local] check option] create # 創建視圖 replace # 替換視圖 algorithm # 視圖算法:undefined系統自己選擇算法;merge表示視圖語句與視圖定義合並,使視圖定義部分替代語句對應部分;temptable表示將視圖結果存入臨時表,用臨時表來執行語句。 view_name # 視圖名稱 column_list # 屬性列 select_statment # select語句 [with [cascaded | local] check option] # 表示權限範圍之內:cascaded表示滿足所有條件。local表示更新時滿足視圖本身條件即可。
單表創建視圖:
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;
# 默認情況下創建的視圖和基本表的字段一樣,也可以通過指定視圖字段的名稱來創建視圖。
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兩個視圖中的字段名稱不同,但是數據卻是相同的。因此在使用視圖的時候,可能用戶根本就不需要了解表的機構,更接觸不到實際表中的數據,從而保證了數據庫的安全。
在多表上創建視圖:
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; # 查看視圖創建信息 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; # 修改視圖和元數據不同 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; # 全部更新
插入數據:
mysql> insert into t values (3,5); # 插入數據 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的數據; mysql> select * from view_t2; mysql> select * from t; # 在view_t2中刪除price=5的操作最終是通過基本表中的相關記錄實現的。 註意: 當視圖中包含有如下內容時,視圖的更新操作將不被執行: 1、視圖中不包含基本表中被定義為非空的列; 2、在定義視圖的select語句後的字段列表中使用數學表達式; 3、在定義視圖的select語句後的字段列表中使用了聚合函數; 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
Mysql之數據庫視圖