select语句的数据源:视图

视图

视图与表有很多相似的地方,视图也是由若干个字段以及若干条记录构成,视图也可以作为select语句的数据源。甚至在某些特定条件下,可以通过视图对表进行更新操作。
在这里插入图片描述

创建视图

视图中保存的仅仅是一条select语句,视图中的源数据都来自于数据库表,数据库表称为基表,视图称为虚表。基表的数据发生变化时,虚表的数据也会随之改变。创建视图的语法格式如下:

CREATE 或者REPLACE  VIEW  视图名(视图列)
	AS SELECT 表列别名
	FROM 表名

视图是数据库的对象,所以创建视图时,需要指定该视图隶属于哪个数据库;视图字段列表中的字段个数必须等于select语句字段列表中的字段个数。

为了区分视图与基本表,在命名视图时,通常加“view”前缀或“_view”后缀。

查看视图的定义

1.在choose数据库中成功地创建了视图course_view后,该视图的定义默认保存在数据库目录(例如choose目录)下,文件名为course_view.frm。使用记事本打开该文件,即可查看该视图的定义。

2.视图是一个虚表,也可以使用查看表结构的方式查看视图的定义,DESC course_view;

3.MySQL命令“show tables;”命令不仅显示当前数据库中所有的基表,也会将所有的视图罗列出来。

4.MySQL系统数据库information_schema的views表存储了所有视图的定义,使用下面的select语句查询该表的所有记录,也可以查看所有视图的详细信息。

select * from information_schema.views\G

修改视图

当基本表的某些字段发生变化的时候,可以通过修改数据库中存在的视图,来保持与基本表的一致性。语法如下:

CREATE OR REPLACE  VIEW 视图名(视图列名)AS SELECT  表列名

与创建视图的语句一致,当视图存在时,修改语句对视图进行修改;视图不存在时,创建。
在这里插入图片描述

ALTER语句是MySQL另外一种修改视图的方法,语法如下:

ALTER VIEW 视图名(视图列名)AS  SELECT 表列名

更新视图

更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。

并不是所有的视图都可以更新,以下几种情况是不能更新视图的:
(1)视图中包含COUNT()、SUM()、MAX()和MIN()等函数。例如:

CREATE VIEW book_view1(a_sort,a_book)
AS SELECT sort,books, COUNT(name) FROM tb_book;

(2)视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVIG等关键字。例如:

CREATE VIEW book_view1(a_sort,a_book)
AS SELECT sort,books, FROM tb_book GROUP BY id;

(3)常量视图。例如:

CREATE VIEW book_view1
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;

(7)视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。例如,表中包含的name字段没有默认值,但是视图中不包括该字段。那么这个视图是不能更新的。因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有NULL值插入。数据库系统是不会允许这样的情况出现的,其会阻止这个视图更新。

注意:

视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。

删除视图

当视图不再需要时,可以将其删除,删除一个或多个视图可以使用DROP VIEW语句,删除视图必须拥有DROP权限。删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。语法如下:

DROP VIEW  IF EXISTS 
     view_name [, view_name] ...
发布了141 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42554191/article/details/103979170