on a.flight=b.flight and a.date=b.date; quit;
1.2.3 全连接full join proc sql;
create table fulljoins as select *
from March a full join Delay b
on a.flight=b.flight and a.date=b.date; quit;
1.3 迪卡尔积 proc sql;
create table cartesian as select a.*,b.*
from March a,Delay b; quit;
这里再大概说明一下内外连接的实现的基本原理:首先生成两个数据表的迪卡尔积,然后再根据where语句来选择符合条件的数据作为输出结果。当然,在实际处理过程中,SQL过程步会对这个迪卡尔积的数据集进行优化,将其划分成小块数据进行处理。
2 复杂的连接
这里因为找不到很好的例子来说明如何处理复杂的连接,因此就不讲解了,大概说一下思路吧:简单地说,对于复杂的查询,我们应该将该查询分解成几个小的子查询,然后对每个子查询的结果进行测试,最后将所有的子查询结合起来就组成了这个复杂的查询。这样会比一来就写复杂的查询容易得多。
3 数据集SET操作
这里有四类SET操作,分别是EXCEPT、INTERSECT、UNION、OUTER UNION。 EXCEPT:得到除第二个数据集以外的所有第一个数据集里的数据 INTERSECT:得到第一个数据集和第二个数据集都有的数据
UNION:得到两个数据集所有的数据,这里如果两个数据集有相同的数据,重复数据只出现一次
OUTER UNION:得到两个数据集所有的数据。
还有两个关键词来修改SET操作的行为:ALL和CORRESPONDING
ALL:并不删除重复值,不能与OUTER UNION合用(注意,用ALL关键词,一种情况是你不管是否会有重复值,另一个情况是不可能出现重复值,例如有主键的数据) CORRESPONDING:只保留两个数据集都有的字段,一般简写为CORR
3.1 EXCEPT
找出所有没有延迟的航班和日期: proc sql;
select flight,date from March except
select flight,date from Delay; quit;
注意:这里重复值已经被删除。如果要得到所有的包含重复值的数据,就要用到关键词ALL: proc sql;
select flight,date from March except ALL
select flight,date from Delay; quit;
如果只保留两个数据集都有的字段,则用到关键词CORRESPONDING(可简写为CORR): proc sql; select *
from March except CORR select *
from Delay; quit;
3.2 INTERSECT
找出所有延迟的航班和日期: proc sql;
select flight,date from March INTERSECT
select flight,date from Delay; quit;
关键词ALL和CORRESPONDING与在EXCEPT中一样,这里不再作介绍
3.3 UNION
选择所有的数据,这里的重复值只出现一次 proc sql;
select flight,date from March UNION
select flight,date from Delay;
quit;
关键词ALL和CORRESPONDING与在EXCEPT中一样,这里不再作介绍
3.4 OUTER UNION proc sql;
select flight,date from March OUTER UNION select flight,date from Delay; quit;
这里,如果我们用到关键词CORR,就可以将相同字段的数据结合到一起: proc sql; select *
from March
OUTER UNION CORR select *
from Delay; quit;
4 建表 4.1 建空表
4.1.1 通过指定变量建空表 proc sql noprint;
create table percent (varname char(30), Industry char(4),
begindate num format date9. label='the beginning date', enddate num format date9. label='the ending date', P_1 num, P_5 num, P_95 num, P_99 num); quit;
4.1.2 拷贝数据集来建空表 proc sql noprint;
create table Delaycopy(keep=flight date) like Delay; quit;
4.1.3 查询语句中,用outobs选项来建空表 proc sql noprint outobs=0; create table flight114 as
select * from Delay; quit;
4.2 对数据表增加数据 主要有三种方法: 4.2.1 SET语句 proc sql noprint; insert into flight114 set flight='302' ,
date='07MAR94'd, orig='LGA', dest='WAS',
delaycat='No Delay', destype='Domestic', delay=0; quit;
4.2.2 VALUES语句 proc sql noprint; insert into flight114
values('271','07MAR94'd,'LGA','PAR','1-10 Minutes','International',4); quit;
4.2.3 条件查询 :建表和导入数据同时完成 proc sql noprint;
create table flight114 as select * from Delay
where flight='114'; quit;
5 完整性约束
完整性约束的好处是保证SAS数据集的连续性和正确性,它在我们更新数据或插入新的数据时,验证新的数据是否符合该变量的约束条件。
完整性约束需要8.0以上版本,符合ANSI标准,可以在表建立时或表有数据后建立约束,但不能被用于视图,也不能用于低于8.0版本的SAS系统建立的数据集。
五大类完整性限制:NOT NULL、CHECK、UNIQUE、PRIMARY KEY、FOREIGN KEY。 NOT NULL:不许出现缺失值
CHECK:指定该变量可以输入哪些值
UNIQUE:每个值必须是唯一的,其值可以为空,但只能有一个值为空 PRIMARY KEY:主键,每个值必须是唯一且非空的
FOREIGN KEY:其它表的主键,即外键,其值为关联表的主键的值且非空
5.1 check
例:
proc sql noprint;
create table percent (varname char(30), Industry char(4),
begindate num format date9. label='the beginning date', enddate num format date9. label='the ending date', percent num,
CONSTRAINT percent _check check (percent le 1.0)); quit;
这时,如果我们插入的数据中,percent>1的话,将会出现错误。
5.2 回滚ROLLBACKS
当我们用INSERT或UPDATE的时候,操作要等到发生错误的时候才会停止,这时会出现一个问题,就是数据表的一些数据更新了,而另一些数据没更新,这时如果我们要回到原来的状态,就需要用到UNDO_POLICY选项进行回滚。 UNDO_POLICY有三个选项:
REQUIRED:缺省选项,取消所有的更新或新插入的数据。这里要注意的是,此操作不一定完全能成功。
NONE:阻止所有的与约束不符的更新或新数据
OPTOINAL:取消所有可以成功取消的更新或新插入的数据
本功能用得很少,所以只是翻译一下,请大家查阅相关文献。
6 创建视图与索引 6.1 视图
视图最大的好处是它只是一个存储的查询,因此不包含任何数据,这可以减少磁盘的使用空间。其它的功能与数据库的表类似。 创建视图语法:
Create View View-name as Query-expression ; 例:
proc sql noprint outobs=0; create View delayview as select * from Delay; quit;
6.2 索引 语法:
Create
On table-name (column-name,column-name);

