创建视图
虽然视图可以被看成是一种虚拟表,但是其物理上是不存在的,即MySQL并没有专门的位置为视图存储数据。根据视图的概念可以发现其数据来源于查询语句,因此创建视图的基本语法为:
CREATE[OR REPLACE] VIEW viewname[columnlist] AS SELECT statement
其中,CREATE表示创建新的视图;
REPLACE表示替换已经创建的视图;
viewname为视图的名称;
columnlist为属性列;
SELECT statement表示SELECT语句;
注意! 创建视图需要登陆用户有相应的权限,查看权限方法:
mysql> select user, Select_priv, Create_view_priv FROM mysql.user; #查询数据库用户创建和选择视图权限
(1)在单表上创建视图
mysql> create table student(id int, name varchar(64), class_id int, sex enum('男', '女'));
mysql> insert into student values(1, '张三', 101, '男'), (2, '李四', 102, '男'), (3, '王五', 102, '男'), (4, '赵六', 101, '男');
mysql> alter table student add privacy varchar(64); #增加隐私列
mysql> select *from student; #查询student表
+------+------+----------+------+---------+
| id | name | class_id | sex | privacy |
+------+------+----------+------+---------+
| 1 | 张三 | 101 | 男 | NULL |
| 2 | 李四 | 102 | 男 | NULL |
| 3 | 王五 | 102 | 男 | NULL |
| 4 | 赵六 | 101 | 男 | NULL |
+------+------+----------+------+---------+
mysql> create VIEW view_student as select id, name, class_id, sex from student; #为学生表创建视图
mysql> select * from view_student; #查看学生视图表
+------+------+----------+------+
| id | name | class_id | sex |
+------+------+----------+------+
| 1 | 张三 | 101 | 男 |
| 2 | 李四 | 102 | 男 |
| 3 | 王五 | 102 | 男 |
| 4 | 赵六 | 101 | 男 |
+------+------+----------+------+
(2)在多表上创建视图
CREATE[OR REPLACE] VIEW viewname[columnlist] AS SELECT statement
其中,CREATE表示创建新的视图;
REPLACE表示替换已经创建的视图;
viewname为视图的名称;
columnlist为属性列;
SELECT statement表示SELECT语句;
与单表上创建视图不同的是,SELECT子句是涉及到多表的联合查询语句。
mysql> create table class(id int, class_name varchar(64), teacher varchar(64)); #创建班级表
mysql> insert into class values(101, '萌新一班', '王老师'), (102, '萌新二班', '马老师'); #班级表插入数据
mysql> create table student(id int, name varchar(64), class_id int, sex enum('男', '女'), FOREIGN KEY(class_id) REFENRENCES class(id)); #创建学生表
mysql> insert into student values(1, '张三', 101, '男'), (2, '李四', 102, '男'), (3, '王五', 102, '男'), (4, '赵六', 101, '男'); #学生表插入数据
mysql> create VIEW view_student_class(id, name, class_name, teacher) AS select class inner join student ON class.id=student.class_id;
mysql> select * from view_student_class;
+------+------+------------+---------+
| id | name | class_name | teacher |
+------+------+------------+---------+
| 1 | 张三 | 萌新一班 | 王老师 |
| 2 | 李四 | 萌新二班 | 马老师 |
| 3 | 王五 | 萌新二班 | 马老师 |
| 4 | 赵六 | 萌新一班 | 王老师 |
+------+------+------------+---------+
更新视图数据
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图实质是一个虚拟表,其中没有数据,通过视图更新时都是转换到基本表更新。更新视图时,只能更新权限范围内的数据,超出范围就不能更新了。
mysql> create table student(id int, name varchar(64), class_id int, sex enum('男', '女'));
mysql> insert into student values(1, '张三', 101, '男'), (2, '李四', 102, '男'), (3, '王五', 102, '男'), (4, '赵六', 101, '男');
mysql> create VIEW view_stdent AS select id, name, class_id from student;
mysql> update view_student set name='张三丰' where name='张三'; #通过视图更新张三为张三丰,student表中的张三也会更新为张三丰
mysql> select * from view_student;
+------+--------+----------+
| id | name | class_id |
+------+--------+----------+
| 1 | 张三丰 | 101 |
| 2 | 李四 | 102 |
| 3 | 王五 | 102 |
| 4 | 赵六 | 101 |
+------+--------+----------+
不能更新的情况:
1.视图中包含SUM()、COUNT()、MAX()和MIN()等函数
2.视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVING等关键字
3.视图对应的表存在没有默认值的列,而且该列没有包含在视图里
4.包含子查询的视图
5.其他特殊情况