创建视图
虽然视图可以被看成是一种虚拟表,但是其物理上是不存在的,即MySQL并没有专门的位置为视图存储数据。根据视图的概念可以发现其数据来源于查询语句,因此创建视图的基本语法为:
CREATE[OR REPLACE] VIEW viewname[columnlist]
AS SELECT statement
其中,CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;viewname为视图的名称;columnlist为属性列;SELECT statement表示SELECT语句;
注意! 创建视图需要登陆用户有相应的权限,查看权限方法:
mysql> use school; #选择数据库school
mysql> select user, Select_priv, Create_view_priv FROM mysql.user;#查询数据库用户创建和选择视图权限
在表单上创建视图
mysql> use school; #选择数据库school
mysql> alter table student add privacy varchar(64);# 增加私隐列
mysql> ;#查询数据库用户创建和选择视图权限
mysql> CREATE VIEW view_student AS select id, class_id, name from student ;#为学生表创建视图
mysql> desc view_student;#查看视图
mysql> select * from view_student; #根据视图进行查询
在多表上创建视图
使用内,外连接的方法
mysql> use school; #选择数据库school
mysql> alter table student add privacy varchar(64);# 增加私隐列
mysql> ;#查询数据库用户创建和选择视图权限
mysql> CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.teacher from class inner join student on class.id = student.class_id;#为学生表创建视图
mysql> desc view_student_class;#查看视图
mysql> select * from view_student_class; #根据视图进行查询
查看视图
DESC viewname 查看设计信息(视图的基本定义)
SHOW TABLES 查看表的名字和视图的名字
SHOW CREATE TABLE tablename/VIEW viewname 查看表/视图的创建信息
更新视图数据
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图实质是一个虚拟表,其中没有数据,通过视图更新时都是转换到基本表更新。更新视图时,只能更新权限范围内的数据,超出范围就不能更新了。
视图操作和表操作类似
mysql> use school; #选择数据库school
mysql> alter table student add privacy varchar(64);# 增加私隐列
mysql> ;#查询数据库用户创建和选择视图权限
mysql> CREATE VIEW view_student AS select id, class_id, name from student ;#为学生表创建视图
mysql> desc view_student;#查看视图
mysql> select * from view_student; #根据视图进行查询
mysql> update view_student set name='小花花' where name='小花'; #通过视图更新小花为小花花
不能更新的情况:
- 视图中包含SUM()、COUNT()、MAX()和MIN()等函数
- 视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVING等关键字
- 视图对应的表存在没有默认值的列,而且该列没有包含在视图里
- 包含子查询的视图
- 其他特殊情况
修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。ALTER语句来修改视图。
(原表的某些列被改变了,基于这个表创建的视图按原本的代码会无法实现,所以需要修改)
使用ALTER语句修改视图
ALTER VIEW viewname[columnlist]
AS SELECT statement
这个语法中的所有关键字和参数除了alter 外,其他都和创建视图是一样的,因此不再赘述。
mysql> use school; #选择数据库school
mysql> alter table student add privacy varchar(64);# 增加私隐列
mysql> ;#查询数据库用户创建和选择视图权限
mysql> ALTER VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student on class.id = student.class_id;#为学生班级表视图增加 class_id 字段
mysql> desc view_student_class;#查看视图
mysql> select * from view_student_class; #根据视图进行查询
删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。
在MySQL中,可使用DROP VIEW语句来删除视图,但是用户必须拥有DROP权限。删除视图的语法如下:
DROP VIEW viewname [,viewnamen];
在上述语句中,参数viewname表示所要删除视图的名称,可同时指定删除多个视图。
mysql> use school; #选择数据库school
mysql> ;#查询数据库用户创建和选择视图权限
mysql> CREATE VIEW view_student_class AS select student.id, student.name, class.name, class.id as class_id, class.teacher from class inner join student on class.id = student.class_id;#为学生表创建视图
mysql> drop view view_student_class;#删除视图