MySQL - 视图操作

2023-11-12

视图操作

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不看整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。

为什么要使用视图

  • 数据库中关于数据的查询有时非常复杂,例如表连接、子查询等,这种查询会让程序员感到非常痛苦,因为它的逻辑太复杂、编写语句比较多,当这种查询需要重复使用时,很难每次都编写正确,从而降低了数据库的实用性。
  • 在具体操作表之前,有时候要求只能操作部分字段,而不是全部字段。例如,在学校里,学生的智商测试结果一般都是保密的,如果因为一时疏忽向查询中多写了关于“智商”的字段,则会让学生的智商显示给所有能够查看该查询结果的人,这时就需要限制使用者操作的字段。
  • 为了提高复杂的SQL语句的复用性和表的操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储数据值的形式存在,行和列数据来自定义视图的查询所引用的基本表,并且在具体引用视图时动态生成。
  • 视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务。这样程序员只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高数据库中数据的安全性。
     
     
  1. 创建视图
    虽然视图可以被看成是一种虚拟表,但是其物理上是不存在的,即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 | 赵六 | 萌新一班   | 王老师   |
    +------+------+------------+---------+
    
  2. 查看视图
    创建完视图后,像表一样,我们经常需要查看视图信息。在MySQL中,有许多可以实现查看视图的语句,如DESCRIBE、SHOW TABLES、SHOW CREATE VIEW。
    如果要使用这些语句,首先要确保拥有SHOW VIEW的权限。
    (1)使用DESCRIBE | DESC语句查看视图基本信息
    前面我们已经详细讲解过使用DESCRIBE语句来查看表的基本定义。因为视图也是一张表,只是这张表比较特殊,是一张虚拟的表,所以同样可以使用DESCRIBE语句来查看视图的基本定义。DESCRIBE语句查看视图的语法如下:

    DESCRIBE | DESC viewname;
    在上述语句中,参数viewname表示所要查看设计信息的视图名称。
    

    (2)使用SHOW TABLES语句查看视图基本信息
    从MySQL 5.1版本开始,执行SHOW TABLES语句时不仅会显示表的名字,同时也会显示视图的名字。
    下面演示通过SHOW TABLES语句查看数据库school中的视图和表的功能,具体SQL语句如下,执行结果如下图所示。

    SHOW TABLES;
    

    (3)使用 show create view/table 语句查看视图创建信息

    SHOW CREATE TABLE或VIEW   viewname;   
    
  3. 更新视图数据
    更新视图是指通过视图来插入(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.其他特殊情况

  4. 修改视图
    修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。ALTER语句来修改视图。
    使用ALTER语句修改视图

    ALTER VIEW viewname[columnlist]   
    	AS SELECT statement            
    
  5. 删除视图
    删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。
    在MySQL中,可使用DROP VIEW语句来删除视图,但是用户必须拥有DROP权限。删除视图的语法如下:

    DROP VIEW viewname [,viewnamen]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL - 视图操作 的相关文章