视图定义
视图是一张虚拟表。它可以是表中数据记录的子集,也可以是表中某几个字段形成的子集。视图可以参照一张或多张基表。视图并不另外单独存储和复制数据,它只是一个结构。视图定义存储在数据字典中,而不是在用户自己的空间里。
创建和使用视图
利用CREATE VIEW命令可以创建视图。需要注意的是,视图是基于一些表来实现的,如果这些表的定义发生了变化,将不会反映到视图的定义中。此时将根据
需要进行手工的同步更新或维护。CREATE VIEW VIEW_NAME
AS SELECT COLUMN1,COLUMN2
FROM TABLE
WHERE COLUMN 3 =字段值
读取此视图的方法和读取普通表无异,eg:SELECT * FROM VIEW_NAME
也可以利用视图来更新记录,eg:UPDATE VIEW_NAME SET COLUMN1 = 值 WHERE COLUMN2 = 值
视图中的连接
在视图中可以包含一个或多个表的列,这时需要使用到多表的连接;举例来说,从雇员表和call_employee表中建立一个视图,作为分派电话使用:
CREATE VIEW employee_call
AS SELECT employee.employee_number
,last_name
,first_name
,call_number
,call_status_code
,assigned_date
,assigned_time
,finished_date
,finished_time
FROM employee
INNER JOIN call_employee
ON call_employee.employee_number
= employee.employee_number;
利用视图重命名列
利用视图可以对列进行重新改名。参考下面的例子:
CREATE VIEW shortcut (emp, dept, last, first, sal)
AS SELECT employee_number
,department_number
,last_name
,first_name
,salary_amount
FROM employee
WHERE department_number = 201;
从视图中选取记录与从普通表无异,这里可以使用已经更名的视图字段,如:
SELECT last
,sal
FROM shortcut
ORDER BY last DESC;
改变视图定义
利用REPLACE语句可修改视图定义;
REPLACE VIEW shortcut (emp, dept, last, first, sal)
AS SELECT employee_number
,department_number
,last_name
,first_name
,salary_amount
FROM employee
WHERE department_number = 301;另外,利用视图还可以对列标题重新命名和对列进行格式化。如下面创建了一个基于部门201的视图,它具有较好的格式化输出。
CREATE VIEW Report AS
SELECT employee_number AS Emp (FORMAT '9999')
,department_number AS dept (FORMAT '999')
,last_name AS Last (TITLE 'Name')
,first_name AS First (TITLE '')
,salary_amount / 12 AS Monthly_Salary (FORMAT '$$$,$$9.99')
FROM employee
WHERE department_number = 201;
聚合视图(Aggregate View)
聚合视图是指视图的列通过聚合计算而得到的视图。例:建立一个视图依部门汇总工资信息。从这个视图的定义可以看出,聚合或派生出来的列必须要给一个名字。
CREATE VIEW deptsals
AS SELECT department_number AS department
,SUM (salary_amount) AS salary_total
,AVG (salary_amount) AS salary_average
,MAX (salary_amount) AS salary_max
,MIN (salary_amount) AS salary_min
FROM employee
GROUP BY department_number;
使用HAVING的聚合视图
利用HAVING子句,修改上述deptsals视图,使之仅包含平均工资小于$36,000的部门,则语句为:
REPLACE VIEW deptsals
AS SELECT department_number AS department
,SUM (salary_amount) AS salary_total
,AVG (salary_amount) AS salary_average
,MAX (salary_amount) AS salary_max
,MIN (salary_amount) AS salary_min
FROM employee
GROUP BY department_number
HAVING AVG(salary_amount) < 36000 ;
视图的限制和总结
视图的限制:
不能基于视图来建立索引,因为视图只是一个定义,本身没有任何数据
视图中不能包含ORDER BY 子句
派生和聚合的列必须要有一个AS子句指定列名
视图不能被UPDATE,如果它包含:❍ 数据来自多个表(JOIN VIEW)
❍ 两次同样的列
❍ 派生的列
❍ 包含DISTINCT 子句
❍ 包含GROUP BY 子句视图的作用和特点:
提供了一个额外的安全、授权层次
帮助控制读和修改权利
如果基表增加了列,该列对视图无影响。
如果列从基表中删除,视图也不受影响,除非删除跟该列相关的视图。
简单化了用户存取
根据视图的特点,对于生产系统,我们建议:
对每一个基表建立至少一个视图
根据需要建立视图查询