返回目录:word文档
前言
视图是数据库系统中一种非常有用的数据库对象,它往往是和外模式联系在一起的概念。外模式是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据时逻辑结构和特征的描述,通常通过数据库用户的数据视图来实现,用于对与某一应用有关的数据进行逻辑表示。
视图概述
视图是从一个或多个表或者视图中导出的表,它也包含一系列带有名称的数据列和若干条数据行,但是,视图不同于数据库中真实存在的表,其区别在于:
视图不是数据库中真实的表,而是一张虚拟表,其结构和数据是建立在对数据库中真实表的查询基础上的。
视图的内容是由存储在数据库中进行查询操作的SQL语句来定义的,它的列数据和行数据都来自于定义视图的查询所引用的真实表(基础表、基表或源表)。
视图不是以数据集的形式存储在数据库中,它所对应的数据实际上是存储在视图所引用的真实表(基础表)中。
视图是用来查看存储在别处的数据的一种设施,其自身并不存储数据。
使用视图的优点:
集中分散数据。即我们需要的数据分散在不同的表中,通过视图可以将这些数据集中在一起。
简化查询语句。视图的查询定义就是模式和外模式之间的映射关系。
重用SQL语句。视图所呈现的数据都是最新的数据,编写完查询之后,可以方便重用,不必了解具体查询细节。
保护数据安全。我们可以只授予用户使用视图的权限,不具体指定使用表的权限,以此来保护数据的安全性。
共享所需数据。通过视图,不同用户所需的数据,只需存储一次即可。
更改数据格式。通过视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中。
创建视图
MySQL中使用CREATE VIEW 语句来创建视图,语法如下:
CREATE [OR REPLACE]
VIEWview_name [(column_list)]
ASSELECT_statement
[WITH[CASCADED | LOCAL] CHECK OPTION]
语法说明:
OR REPLACE:可选,用于指定OR REPLACE子句,该语句用于替换数据库中已有的同名视图。
view_name:指定视图的名称。在数据库中必须唯一,不能与其他表或视图同名。
column_list:可选项,为视图中的每个列指定明确的名称。列名的数目必须等于SELECT 查询的列数,列名用逗号分隔。
SELECT_statement:用于指定创建视图的SELECT 语句。
WITH CHECK OPTION:这个可选项用来指定在可更新视图上所进行的修改都需要符合SELECT_statement中所指定的限制条件,这样可以确保数据修改后仍可以通过视图看到修改后的数据。视图根据另一个视图定义时,CASCADED | LOCAL,他们决定检查测试的范围,其中,CASCADED 为默认值,它会对所有视图进行检查,关键字LOCAL则使CHECK OPTION 只对定义的视图进行检查。
对于SELECT语句的限制:
①定义视图的用户除了要求被授予CREATE VIEW权限外,还必须被授予可以操作视图所涉及的基础表或其他视图的相关权限。
②SELECT 语句不能包含FROM子句中的子查询。
③SELECT 语句不能引用系统变量或用户变量。
④SELECT 语句不能引用预处理语句参数。
⑤在SELECT 语句中引用的表或视图必须存在。
⑥引用其他数据库的表或视图时,需要在表或视图前面添加数据库名称。
⑦在由SELECT 语句构造的视图定义中,允许使用ORDERBY 子句。但是从特定视图进行选择时,该视图使用了自己的ORDER BY 子句,则视图定义中的ORDER BY 子句会被忽略。
⑧对于SELECT语句中的其他选项或子句,若所创建的视图中也包含了这些选项,则语句执行效果未定义。
下面看一下SQL语句。
#创建视图v_student,要求该视图包含客户信息表tb_student中所有男生的信息,并且要求保证今后对该视图数据的修改都必须符合学生性别为男这个条件。
CREATE OR REPLACE VIEW db_school.v_student
AS
SELECT * FROM db_school.tb_student WHEREsex = ‘男’
WITH CHECK OPTION;
#使用视图创建视图
CREATE VIEW db_school.v_score
AS
SELECT * FROM db_school.tb_score WHERE score< 90
WITH CHECK OPTION;
CREATE VIEW db_school.v_score_local
AS
SELECT * FROM db_school.v_score WHERE score> 80
WITH LOCAL CHECK OPTION;
视图的其他操作
删除视图
删除视图可以直接使用DROP VIEW,语法格式如下:
DROP VIEW IF EXISTS view_name, ...
#删除数据库db_school中的视图v_student
DROP VIEW IF EXISTS db_school. v_student;
修改视图定义
像修改表一样,可以使用ALTER VIEW语句来修改视图定义,语法如下:
ALTER VIEW view_name [(column_list)]
ASSELECT_statement
[WITH[CASCADED | LOCAL] CHECK OPTION]
#修改上面视图v_student的定义
ALTER VIEW db_school.v_student(studentNo, studentName,classNo)
AS
SELECT studentNo, studentName, classNo FROMdb_school.tb_student
WHERE sex = ‘男’ and nation = ‘汉’
WITH CHECK OPTION;
查看视图定义
可以使用SHOW CREATE VIEW 语句查看已有视图的定义(结构),语法是:
SHOW CREATE VIEW view_name;
#查看db_school中视图v_student的定义:
SHOW CREATE VIEW db_school.v_student\\G
更新视图数据
由于视图是一个虚拟表,所以通过插入、修改和删除等操作来更新视图中的数据,实质上是在更新视图所引用的基础表中的数据。
另外,如果视图包含了以下任何一种SQL语句结构,那么该视图都是不可更新的:
聚合函数。
DISTINCT 关键字。
GROUP BY 子句。
ORDER BY子句。
HAVING子句。
UNION运算符。
位于选择列表中的子查询。
FROM 子句中包含多个表。
SELECT 语句中引用了不可更新视图。
WHERE子句中的子查询,引用FROM子句中的表。
更新视图数据和更新普通表是一样的,但是要符合上面的条件。这里就不一一列举了。
查询视图数据
我们定义完之后,就可以像查询数据库中的表一样,对视图进行数据分析,这也是对视图使用最多的一种操作。视图用于查询检索,主要体现在下面的一些应用:
利用视图简化复杂的表连接。
使用视图重新格式化检索出的数据。
使用视图过滤不想要的数据。
#在视图v_student中查找classNo为“CS1701”的学生学号和姓名:
SELECT studentNo, studentName
FROM db_school.v_student
WHERE classNo = ‘CS1701’;
视图的使用说明
在MySQL中,视图的使用还需要注意以下几点:
创建视图必须具有足够的访问权限。
对于可以创建的视图数目没有限制。
视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。
ORDER BY 子句可以用在视图中。
视图不能索引,也不能有关联的触发器、默认值。
视图可以和表一起使用。
由于视图不包含数据,所以每次使用视图时都必须处理查询执行时所需的任何一个检索操作。
小结
上面就是今天的主题内容了,今天学习一下MySQL中的视图,这可以极大的简化我们的查询。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。