视图是一系列的查询语句,在使用时被执行,用来从其他的数据集或视图中获取想要的子集(subset)或者超集(superset)。
只包含访问数据的逻辑,而不包含数据本身。
1、与数据集相比,更节省空间
2、减少重复的查询语句
3、想用户隐藏复杂的查询关系
4、动态获取最新数据
1、避免在视图定义中使用ORDER BY子句,在引用视图的查询中指定ORDER BY子句更有效。
2、如果同样的data要用很多次,那么最好不要创建视图而是直接创建静态表
3、避免创建基于结构可能更改的表的视图。当视图引用的列不存在时,视图的列也就无效了
CREATE VIEW语句
CREATE VIEW proc-sql-view AS
SELECT column-1<, ... column-n>
FROM table-1 | view-1 ... table-n | view-n>
;
1、在提交代码时,sas并不执行select语句,而是将SELECT语句部分编译并将其存储在视图文件中。
2、SAS日志中的消息确认已经定义了视图。
NOTE: SQL view CERTADV.FAVIEW has been defined.
DESCRIBE VIEW语句
DESCRIBE VIEW proc-sql-view-1<,...proc-sql-view-n>;
1、可以在SAS日志中显示视图的定义
2、如果建立的视图基于另一个视图上,那么需要在PROC SQL语句中使用FEEDBACK选项。
如果DESCRIBE VIEW后面的视图指定了库名,那么from后的如果不指定库名则默认为在sasuser中。
proc sql;
create view sasuser.payrollv as
select *
from payrollmaster;
quit;
USING libname-clause-1<,... libname-clause-n>;
1、只能与PROC SQL视图一起使用。
2、using 语句创建的库名,不会与SAS会话中的库名冲突,可以理解为局部语句。
3、无论视图和基础表是否位于同一个库中,都可以使用它
4、USING子句必须是CREATE VIEW语句中的最后一个子句
proc sql;
create view certadv.payrollv as
select*
from airline.payrollmaster
using libname airline 'SAS-library-one';
quit;
proc print data=certadv.payrollv;
run;
更新视图不会更改视图的存储指令。只更新基础表中的数据。
只有在指定条件下可以对视图进行INSERT、UPDATE 、DELETE操作
1、只能通过视图更新单个表,该表不能联接或链接到另一个表,也不能包含子查询;
2、不能更新派生列(表达式生成的列)
3、不能更新包含任何其他子句(如ORDER BY或HAVING子句)的视图
4、不能更新包含GROUP BY子句的视图
3、举例:
1、虽然MonthlySalary是派生列,不能使用UPDATE语句更改,但它会被更新,因为它是从Salary派生的。
2、当提交PROC SQL步骤时,SAS日志中会出现一个说明,指出有多少行被更新。
NOTE: 2 rows were updated in CERTADV.RAISEV.
/*创建视图*/
proc sql;
create view certadv.raisev as
select empid, jobcode, salary format=dollar12.,
salary/12 as MonthlySalary format=dollar12.
from certadv.payrollmaster;
quit;
proc sql;
select *
from certadv.raisev
where jobcode in ('PT2','PT3');
quit;
/*更新视图*/
proc sql;
update certadv.raisev
set salary=salary * 1.20
where jobcode='PT3';
quit;
DROP VIEW语句
DROP VIEW view-name-1 <,...view-name-n>;
提交该步骤后,SAS日志中会出现一条消息,确认视图已被删除。