视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,视图还可以从已经存在的视图的基础上定义。视图的行为与表非常相似,单视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE、DELETE修改记录。
视图一经定义遍存储在数据库中,通过视图看到的数据就是存放在基本表中的数据。对视图操作和对表操作一样。
简化用户对数据的理解,简化用户对数据的操作。
通过视图用户只能查询和修改他们所能看到的数据。数据库中的其他数据则看不到、无法修改。
视图帮助用户评比真实表结构变化带来的影响
create [ or replace] [algorithm = { undefined | merge | temptable}]
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:
algorithm取值 | 备注 |
---|---|
undefined | 未定义 |
merge | 表示将使用的视图语句与视图定义合并起来,是的视图定义的某一部分取代语句对应的部分 |
temptable | 表示将视图的结果存入临时表,然后用临时表来执行语句 |
cascaded与local为可选参数,cascaded为默认值,表示更新视图时要满足所有相关视图和表的条件;local表示更新视图时满足该视图本身定义的条件即可。
创建视图需要的权限:
测试表结构与数据创建
-- 创建测试表结构
mysql> create table t (quantity int, price int);
Query OK, 0 rows affected (0.03 sec)
-- 插入测试数据
mysql> insert into t values(3, 50);
Query OK, 1 row affected (0.02 sec)
-- 查看测试数据
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 3 | 50 |
+----------+-------+
1 row in set (0.00 sec)
创建一个视图,共有三个字段,quantity,price , quantity* price
-- 创建一个视图view_t
mysql> create view view_t as select quantity,price,quantity * price from t;
Query OK, 0 rows affected (0.00 sec)
-- 查询视图
mysql> select * from view_t;
+----------+-------+------------------+
| quantity | price | quantity * price |
+----------+-------+------------------+
| 3 | 50 | 150 |
+----------+-------+------------------+
1 row in set (0.00 sec)
默认情况下视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图:
-- 新建视图
mysql> create view view_2 (qty, price, total) as select quantity, price, quantit
y*price from t;
Query OK, 0 rows affected (0.00 sec)
-- 查看视图
mysql> select * from view_2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
1 row in set (0.00 sec)
可以看出view_t1和view_t2两个视图中字段名称不同,但是数据确实相同的。因此,在使用视图的时候,可能用户根本就不需要了解表的节骨,更接触不到实际表中的数据,因而保证了数据的安全性。
-- 创建表结构
mysql> create table student(
-> s_id int,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.02 sec)
-- 插入测试数据
mysql> insert into student values(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
-- 创建学生信息表
mysql> create table stu_info (
-> id int ,
-> name varchar(20),
-> glass varchar(20));
Query OK, 0 rows affected (0.02 sec)
-- 插入学生信息
mysql> insert into stu_info values(1,'wuban','henan'),(2,'liuban','heibei'),(3,'
qiban','shandong');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
-- 查看学生信息
mysql> select * from stu_info;
+------+--------+----------+
| id | name | glass |
+------+--------+----------+
| 1 | wuban | henan |
| 2 | liuban | heibei |
| 3 | qiban | shandong |
+------+--------+----------+
3 rows in set (0.00 sec)
创建视图:
-- 创建视图
mysql> create view stu_galss (id, name, glass)
as select student.s_id, student.name, stu_info.glass
from student, stu_info where student.s_id = stu_info.s_id;
Query OK, 0 rows affected (0.02 sec)
-- 查看视图
mysql> select * from stu_galss;
+------+----------+----------+
| id | name | glass |
+------+----------+----------+
| 1 | wanglin1 | henan |
| 2 | gaoli | heibei |
| 3 | zhanghai | shandong |
+------+----------+----------+
3 rows in set (0.02 sec)
查看视图是查看数据库中已经存在的视图的定义。必须要有show view权限,MySQL数据库下的user表中保存着这个信息。查看视图的方法包括:describe、show table status和show create view 。
describe 视图名
-- 查看视图
mysql> describe view_t;
+------------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| quantity * price | bigint(21) | YES | | NULL | |
+------------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
show table status like '视图名'
mysql> show table status like 'view_t' \G
*************************** 1. row ***************************
Name: view_t
Engine: NULL
Version: NULL
Row_format: NULL
Rows: NULL
Avg_row_length: NULL
Data_length: NULL
Max_data_length: NULL
Index_length: NULL
Data_free: NULL
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: NULL
Checksum: NULL
Create_options: NULL
Comment: VIEW
1 row in set (0.00 sec)
show create view 视图名
mysql> show create view view_t \G;
*************************** 1. row ***************************
View: view_t
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL
SECURITY DEFINER VIEW `view_t` AS select `t`.`quantity` AS `quantity`,`t`.`price
` AS `price`,(`t`.`quantity` * `t`.`price`) AS `quantity * price` from `t`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
create [ or replace] [ algorithm = {undefined | merge | temptable}]
view view_name [(column_name)]
as select_statment [with [cascaded | local] check option]
-- 未修改之前
mysql> describe view_t;
+------------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| quantity * price | bigint(21) | YES | | NULL | |
+------------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
-- 如果存在就使用查询语句替换,如果不存在就创建
mysql> create or replace view view_t as select * from t;
Query OK, 0 rows affected (0.01 sec)
mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
可以看到少了一条quantity * price的字段。
alter [algorithm = {undefined | merge | temptable}]
view view_name [(column_list)]
as select_statement
[with [cascaded | local] check option]
-- 修改前
mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
-- 修改
mysql> alter view view_t as select quantity from t;
Query OK, 0 rows affected (0.00 sec)
-- 修改后
mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。
-- 视图修改前
mysql> select * from view_t;
+----------+
| quantity |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
-- 基本表修改前
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 3 | 50 |
+----------+-------+
1 row in set (0.00 sec)
-- 更新视图
mysql> update view_t set quantity=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-- 查看基本表,发现被更新
mysql> select * from t;
+----------+-------+
| quantity | price |
+----------+-------+
| 5 | 50 |
+----------+-------+
1 row in set (0.02 sec)
-- 查看视图
mysql> select * from view_t;
+----------+
| quantity |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec)
drop view [if exists]
view_name [, view_name]...
[restrict | cascade]
view_name是要删除的视图名称
mysql> drop view if exists stu_galss;
Query OK, 0 rows affected (0.00 sec)
区别:
联系:
视图是在基本表之上建立的表,它的结构和内容都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和逻辑意义上建立的新关系。