1.什么是视图?
视图是由数据库中的一个表或多个表导出的虚拟表。其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而没有存放视图中的数据。这些数据还是存在原来的表中,使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此视图中的数据是依赖于原来的表中的数据。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:
1.1 安全原因:视图可以隐藏一些数据
1.2 可以使复杂的查询易于理解和使用。
2.视图的作用
对视图中所引用的基础表来说,视图的作用类似于筛选。
2.1 简单性:看到的就是需要的
视图不仅可以简化用户对数据的理解,也可以简化他们的操作,那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
2.2 安全性
视图的安全性可以防止未授权用户查看特定的行或列,使有权限用户只能看到表中特定行的方法
1.在表中增加一个标志用户名的列
2.建立视图,使用户只能看到标有自己用户名的列
3.把视图授权给其他用户
2.3 逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立,如果没有视图,程序一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
1.如果应用建立在数据表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而使应用程序可以不动。
2.如果应用建立在数据表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使应用程序可以不动。
3.如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不动
4.如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而使数据库可以不动。
3. 创建视图
创建视图是在已经存在的数据库表上建立视图,视图可以建立在一张表中,也可以建立在多张表中。
3.1 查看创建视图的权限
创建视图需要CREATE VIEW的权限,同时应该具有查询涉及列的权限。可以使用select语句来查询这些权限信息,查询语法如下。
select Select_priv,Create_view_priv from mysql.user where user=‘root';
3.2 创建视图
1.在tb_book上建立视图
CREATE
VIEW book_view(a_sort,a_talk,a_books)//视图名(属性清单:可选参数,指定视图中各个属性的名称,默认情况下与select语句中查询的属性相同) AS SELECT sort ,talk,books from tb_book;
2.在tb_book表和tb_user表上创建名为book_view1的视图
CREATE algorithm=merge //视图选择的算法 VIEW book_view1(a_sort,a_talk,a_books,a_name) as select sort,talk,books,tb_user.name from tb_book,tb_name where tb_book.id=tb_name.id with local check option;//表示视图更新时要保证在该视图的权限范围之内。
3.在实际开发过程中的数据表中可能有很多的字段,但某个模块可能只需要其中的几个。为了提高查询的速度和简化操作,可以将该模块需要的字段单独提取出来放在某个视图中。
例子:有学生表和成绩表,在建立的视图中只含有与学生成绩有关的字段
CREATE view scoreinfo as select sno.sname,yw,wy,sx from tb_student,tb_score where tb_student.id=tb_score.sid;
创建视图的注意事项:
1.运行创建视图的语句需要用户具有创建视图的权限,若加了[or replace]时,还需要用户具有删除视图的权限
2.select语句不能包含from子句中的子查询
3.select语句不能引用系统或用户变量
4.select语句不能使用预处理语句参数
5.在存储子程序内,定义不能引用子程序参数或局部变量。
6.在定义引用的表或者视图必须存在。但是创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可以使用CHECK TABLE语句。
7.在定义中不能引用临时表,不能使用临时视图
8.在视图中定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。
4.视图操作
4.1查看视图
1.DESCRIBE(简写成DESC)
DESC bool_view1;
2.show table status
show table status like 'scoreinfo'//like表示后面匹配的是字符串,视图是要查看的视图名称,需要用单引号定义
3.show create view
show create view scoreinfo;
4.2 修改视图
修改视图是修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。
1.create or replace view
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW book_view(a_sore,a_book) as select sort,books from tb_book;
2.alter
alter view book_view1(a_sort) as select sort from tb_book with check option;
4.3 更新视图
对视图的更新其实就是对表的更新,更新视图是指通过视图来插入,更新,删除表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据,超出了范围,就不能更新。
update scoreinfo set yw="90" where id=2;
1.更新视图的限制
(1)视图中包含count(),sum(),max(),min()函数
create view bookview(a_sort,a_book) as select sort,books ,count(name) from tb_book group by id;
(2) 视图中包含union,union all,distinct,group by 和having等关键字
create view book_view1(a_sort,a_book) as select sort,books from tb_book group by id;
(3)常量视图
CREATE VIEW book_view as select 'Aric' as a_book;
(4) 视图的select中包含子查询
CREATE VIEW book_view1(a_sort) as select (select name from tb_book);
(5)由不可更新的视图导出的视图
CREATE VIEW book_view1 AS SELECT * FROM book_view2;
(6) 创建视图时,ALGORITHM为TEMPTABLE类型
CREATE ALGORITHM=TEMPTABLE VIEW book_view1 as select * from tb_book;
4.4 删除视图
删除视图是指删除数据库中已经存在的视图。删除视图时,只能删除视图的定义,不会删除数据。mysql中使用DROP VIEW语句来删除视图。但是用户必须有DROP权限。
DROP VIEW IF EXISTS bOOK_view1;