目录
1. 视图介绍
视图是虚表,是已经编译好的 SQL 语句。视图是基于实际的表生成的虚拟的表,因此视图没有物理记录,是数据库的一个窗口。我们可以通过这个窗口对数据库中暴露在视图中的信息进行相应的操作。对视图中的数据进行增删改查的操作,实际表中的数据也会发生变化。同样的对实际表中的数据进行修改,变化也会反映到视图上。
通过视图我们可以将希望用户看到的表信息暴露给用户,一方面能够简化用户对于数据库的理解,另一方面用户只能对视图中见到的数据进行操作,也保证了数据库的安全性。
2. 创建视图
首先创建一个表, adminuser。
CREATE TABLE `adminuser` (
`uId` int(30) NOT NULL AUTO_INCREMENT,
`userName` varchar(30) DEFAULT NULL,
`password` varchar(30) DEFAULT NULL,
PRIMARY KEY (`uId`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
使用 CREATE VIEW 语句创建一个视图语句如下
CREATE VIEW view_adminuser AS SELECT uid,username,password FROM adminuser;
查看视图,已经创建了一个 view_adminuser 的视图
mysql> SELECT * FROM view_adminuser;
+-----+----------+----------+
| uid | username | password |
+-----+----------+----------+
| 1 | dsa | 123 |
+-----+----------+----------+
1 row in set
视图可以自定义字段名称
CREATE VIEW view_adminuser2(auid,ausername) AS SELECT uid,username FROM adminuser;
mysql> SELECT * FROM view_adminuser2;
+------+-----------+
| auid | ausername |
+------+-----------+
| 1 | dsa |
+------+-----------+
1 row in set
在原先的字段名称上都添加了一个 a,同时去除password字段。所以视图就像一个窗口,我们让用户看到我们希望他们看到的数据,保证了数据库的安全性。同时也简化了用户对于数据的理解,他们只需要关注需要关注的内容即可。
接下来,基于多个表创建视图。
CREATE VIEW view_order(username,orderid,oredertotal) AS SELECT u.username,o.oid,o.total
FROM user u,orders o WHERE u.uid = o.uid ;
只在视图中包含用户的名称,而不暴露用户的基本数据,起到了保护表中数据的作用。
3. 查看视图
DESC view_order
SHOW TABLE STATUS LIKE 'view_order'
mysql> DESCRIBE view_order;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| orderid | int(11) | NO | | 0 | |
| oredertotal | double | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
3 rows in set
以上能查看视图,还可以在 Mysql 的 information_schema 查看所有视图信息
SELECT * FROM information_schema.views;
4.修改视图
查看 view_adminuser 视图
mysql> DESC view_adminuser;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| uid | int(30) | NO | | 0 | |
| username | varchar(30) | YES | | NULL | |
| password | varchar(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set
修改视图 CREATE OR REPLACE
CREATE OR REPLACE VIEW view_adminuser AS SELECT uid,username FROM adminuser;
mysql> DESC view_adminuser;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| uid | int(30) | NO | | 0 | |
| username | varchar(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
2 rows in set
方法和创建视图一样,只是使用的语句略有差异,经过修改少了 password 字段。
Mysql 还提供了使用 ALTER VIEW 的方法修改视图,再把 id 也删了试试
ALTER VIEW view_adminuser AS SELECT username FROM adminuser;
mysql> DESC view_adminuser;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(30) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
1 row in set
5. 更新视图
查看视图 view_adminuser2,和表 adminuser,视图中的字段来自于表。
mysql> SELECT * FROM view_adminuser2;
+------+-----------+
| auid | ausername |
+------+-----------+
| 1 | dsa |
+------+-----------+
1 row in set
mysql> select * from adminuser;
+-----+----------+----------+
| uId | userName | password |
+-----+----------+----------+
| 1 | dsa | 123 |
+-----+----------+----------+
1 row in set
进行修改操作
UPDATE view_adminuser2 SET ausername = 'csdn' WHERE auid = 1;
再次查看两个表数据
mysql> SELECT * FROM view_adminuser2;
+------+-----------+
| auid | ausername |
+------+-----------+
| 1 | csdn |
+------+-----------+
1 row in set
mysql> select * from adminuser;
+-----+----------+----------+
| uId | userName | password |
+-----+----------+----------+
| 1 | csdn | 123 |
+-----+----------+----------+
1 row in set
视图中的数据进行修改,表中的数据也进行相应的修改。
对视图的操作和对普通表类似,但是当视图中存在以下情况,视图的更新操作将不能执行:
- 视图中不包含机表中被定义为非空的列
- 在定义视图的SELECT语句后的字段列表中使用了数学表达式
- 在定义视图的SELECT语句后的字段列表中使用了聚合函数
- 在定义视图的SELECT语句后的字段列表中使用了DISTINCT,UNION,TOP,GROUP BY,HAVING子句
——《MySQL 5.6 从零开始学》
6. 删除视图
DROP VIEW IF EXISTS view_adminuser
视图虽然现在还没能用到过,但是补充一下知识,以待不时之需。