Skip to content

19.视图

视图概述

限制其它用户对数据库表的访问,因为视图可以有选择性的显示数据库表的一部分; 容易实现复杂的查询; 对于相同的数据可以产生不同的视图;

视图分类

视图分为简单视图和复杂视图,最基本差别在DML操作上

创建试图

sql
create view 查询语句

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
VIEW view_name [(column_list)] 
AS select_statement
 [WITH [CASCADED | LOCAL] CHECK OPTION]

OR REPLACE:如果所创建的视图已经存在,该选项表示修改原视图的定义;

view_name :视图的名称;

column_list :列名,列名的数量必须和视图所对应查询语句的列数量相等;

select_statement :一条完整的SELECT语句;

WITH CHECK OPTION:一个约束条件,通过视图所插入或修改的数据行必须满足视图所定义的查询;

ALGORITHM子句是可选的,它表示使用何种算法来处理视图。此外,它并不属于标准SQL的一部分,而是MySQL对标准SQL进行的功能扩展。ALGORITHM可以设置三个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,则默认值为UNDEFINED(未定义的)。

对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。 对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。 对于UNDEFINED,MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。 [WITH [CASCADED | LOCAL] CHECK OPTION]是可选的。该选项中的CASCADED为默认值,LOCAL CHECK OPTION用于在可更新视图中防止插入或更新行,此选项一般不使用。

示例:

表请参考,18.11章节

sql
CREATE  OR REPLACE VIEW  v_queryorder (a,b) AS
SELECT 
  myorder.order_num,
  SUM(COUNT) 
FROM
  detail 
  INNER JOIN myorder 
    ON detail.order_num = myorder.order_num 
GROUP BY myorder.order_num ;
SELECT  *  FROM v_queryorder;

例:创建一个视图v_emp10,通过该视图只能查看10号部门的员工编号,员工姓名,职位。

sql
-- 例:创建一个视图v_emp10,通过该视图只能查看10号部门的员工编号,员工姓名,职位。
CREATE OR REPLACE VIEW v_emp10 (NO, NAME, WORK) AS 
SELECT 
  empno,
  ename,
  job 
FROM
  emp 
WHERE deptno = 10 ;
sql
DESC v_emp10
Field	Type		Null	Key	Default	Extra
no		int(4)		NO		\N	
name	varchar(10)	YES		\N	
work	varchar(9)	YES		\N

创建试图练习

1.创建一个视图,通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号,姓名,工资。

2.通过上述创建的视图查询数据

sql
/***

1.创建一个视图,通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号,姓名,工资。

2.通过上述创建的视图查询数据
**/
CREATE OR REPLACE VIEW  emp_sal (eno,NAME,salary)  AS 
SELECT empno ,ename ,sal FROM emp WHERE sal BETWEEN 2000 AND  5000 AND ename LIKE '%A%'

SELECT * FROM emp_sal;

复杂试图的创建

创建视图时,在子查询中使用列的别名

例:创建一个视图,通过该视图可以查看每个部门的名称,最低工资,最高工资,平均工资

复杂试图的创建练习

1.创建一个视图,通过该视图可以查询到工作在NEW YORK和CHICAGO的员工编号,姓名,部门编号,入职日期。

2.创建一个视图,通过该视图可以查询到每个部门的部门名称及最低工资。

3.通过如上视图,查询每个部门工资最低的员工姓名及部门名称

修改试图

用 CREATE OR REPLACE VIEW子句修改视图empvu10,为每个列添加别名。

CREATE VIEW子句中别名的顺序必须和内部查询中的列的顺序一一对应。

视图上执行DML操作

在简单视图上可以执行 DML 操作;

您可以通过视图删除基表中数据,只要视图中不出现以下情况:

  • Group 函数;
  • GROUP BY 子句;
  • DISTINCT 关键字;

您可以通过视图修改基表中数据,只要视图中不出现以下情况:

  • GROUP函数、
  • GROUP BY子句,
  • DISTINCT关键字;
  • 使用表达式定义的列;

您可以通过视图向基表插入数据,只要视图中不出现以下情况:

  • GROUP函数、GROUP BY子句,DISTINCT关键字;
  • 使用表达式定义的列;
  • 基表中未在视图中选择的其它列定义为非空并且没有默认值;

如果要确保在视图上执行的DML操作仅限于一定的范围,便可使用WITH CHECK OPTION子句;

在视图中任何修改部门编号的操作都会失败,因为这违反了 WITH CHECK OPTION约束。

删除试图

删除视图并不会删除数据,因为视图是基于数据库中的基表的虚表。

sql
DROP VIEW view;

Released under the MIT License.