PROC SQL 的学习经验小结
关键词:sas proc sql,proc sql,proc sql case when,sql create proc,proc sql format,proc sql 合并
实习过或者有志于从事数据这一块的同学肯定都知道SQL 的query 是所有数据挖掘的入门工具,实习的时候boss也说了,想要进这种数据挖掘的公司,不会SQL是想都不用想了,我最早接触SQL语句就是从SAS中的PROC SQL开始,一开始也只是图 select 变量或者数据会快一些,后来实习或者面试 ,然后自己看书,渐渐发现SQL确实是一个非常强大的工具,在SAS中也是如此,熟练了SQL语句,你的数据检索能力会有一个质的飞跃,无论是在质上还是在速度上。我这篇文章主要是借鉴的SAS 公司的 SAS_9.2_SQL_Procedure_User’s_Guide,当然是英文版的,这本书非常全,我主要会介绍比较常用的query语句,剩下对于宏的SQL应用,有兴趣的同学可以和我交流。
这本书和书上的数据集我也会附在附件里,希望有兴趣的同学可以回去下载,然后仔细看看,并且实际练习一下;
variable: 变量;
table: 数据表;
condition: 条件语句;
(一)
首先我简单的介绍一下基本的query语句,从一个表中来选取变量,基本的格式是这样的:
select variable1, variable2, variable3…..from table
where condition1 and/or condition2….
group by variable1, variable2, variable3……
having condition1, condition2…..
order by variable1, variable2
这就是最基本的格式select, from, where, group by, having, order by
但是这边会有一些地方需要大家注意,首先select出来的语句会直接print到你的观察视窗中,你选定的输出地点;
这边where 和 group by 是不能一起使用的,简单的举例来说,是这么个情况,你要从一个table中选变量,但是你对变量有要求,你可以用where来进行一个筛选;你要对变量进行分类, 你用group by, 这里就有一个分类的问题在这里, 为什么要分类, 怎么分类;
其实, 对于我个人来说, group by 主要是和聚集函数用在一起(也就是sum, count, max, min之类), 比如说对性别(sex)分别求sum, 那么就可以这么写
select sum(variable) as sum group by sex
(这里是把这个总量设成一个新的变量叫sum, 这里as是可以不加的,但是我觉得最为一个初学者, 最好可以把这些as, 以及我稍后会讲到的那些label, 能写的最好都写完整, 以后熟练了, 再开始简写会比较好, 反正我现在的状态都是会写完整的, 菜鸟水平) ;
但是group by 和where 是不能一起使用的, 那我要是再想进行分类该怎么办呢, 这里就要讲到一个非常重要的选项having, having语句设定的机制是这样的,当有聚集函数和group by语句的时候, 它就是根据group by 的结果来进行分类, 举个例子来说
select sum(height) as sum label=’总身高’ format=4.1 from class
group by class
having calculated sum gt 150
order by sex desc
这一个过程中有好几点大家可以看出来,首先,sum(height)是一个聚集函数(不一定是函数,我们简单的计算也是可以使用的,甚至直接写“…”内容也是可以的),as sum 是命名为sum,而且后面可以直接跟label和format,这里label也是可以省略的,但是我推荐大家保留,group by class,那么这个sum就会对年龄进行分类处理,对各个班级开求总身高,having 这里就是对sum设定一个条件,只要总身高大于150的这些班级;
order by 就是对结果进行排序,desc就是降序,默认是升序,这里和proc sort 的by 语句有点小区别和相同点,desc 都只对一个变量有用,但是这里是加在变量后面, 而proc sort 是加在变量前面;
ps: 大家经常会看到*这个符号,这个就是选取所有的变量, eg. select * from class, 那么就会把class 中所有的变量都输出出来;
然后我再来简单的讲一下case语句的用法;
case 其实是在正规的sql语句中用的非常多的一个语句,但是SAS中我们往往很少用,我觉得原因是SAS中再data步中可以完成case语句的作用,所以大家在做的时候其实都会用if then 语句来解决这个问题,当然,我觉得if then 比case 灵活很多,而且在mysql中其实也是会经常用if then 语句的,这个跑题了;
case variabel
when then
…
else ..
end as variabel2
这个就是case 的基本格式(请大家注意else这个语句,该用的时候千万不要漏了)
我来举个例子
eg.
case sex
when male then ‘男人’
else ‘女人’
end as sex2
我就造了一个新变量叫sex2,当然,也可以不把sex放在上面
case
when sex = ‘male’ then ‘男人’
else ‘女人’
end as sex2
两个用法是一样的;
这些就是很简单的检索语句;
中间有很多有用的语法和小技巧,比如说count(distinct name) 这里计算的就是不重复的名字数目;
还有where 的一些用法 where like , where in (…), where in (select … from …)我就不一一详细介绍了,感兴趣的同学可以去书里看看,都介绍的很清楚,
(二)
根据我去ebay面试的经历来看,它们比较看重的其实就是left join 的用法,缺失sql里面合并的用法很多,用法也很灵活,大家可以好好看看书上的介绍来理解一下。
简单分下类,join主要分为inner join 以及outer join
理解起来可以看inner join 是把匹配的列都放在一起,而outer join 会把部分不匹配的也放进来,放哪些进来就要看你的语句了;
举个例子来看;
select variable1, variable2 from a, b;
这样出来的是什么呢,这是笛卡尔积,简单来说把variable1中的所有行和variable2中的所有行一一对应,比如说a1,a2,a3 三行,b里面是b1,b2,b3三行,
结果就是a1,b1,a1,b2,a1,b3,a2,b1….变成了3*3九行;
但是,你在后面加上on对条件进行限制,那么这就变成了inner join,也就是只有满足条件的才会被提取,比如说
select variable1, variable2 from a, b on a.variable1=b.variable2; 这样就相当于对笛卡尔积进行了一个筛选;
left join select variable1, variable2 from a left join b on a.variable1=b.variable2; 这里出来的结果,a,variable1的结果都会有, 而variable2的匹配的才会出现;
right join 和上面刚好相反,只有b中的才会全部出现,a中的匹配的才会出现;
书中有图片来反映结果,我相信大家看了会更容易理解;
剩下的我说一下两个查询结果整合在一起;
union, except, intersect, outer union;
这四个合并方法都有两个选项可以使用 all 和 corr(corresponding)
all是把所有的结果都写出来,也就是说重复的不会合并,all不能与outer union合用;
corr 用在union, except, intersect三个中,只会输出合并的那一列,用在outer union 中,效果会比较好;
用书上的例子来说明一下吧;
table a;
x y
1 one
2 two
2 two
3 three
table b;
x z
1 one
2 two
4 four
1、union 会把两个查询结果合并在一起,相同的会合并,不同的就不会合并
select * from a
union
select * from b
结果:
x y
1 one
2 two
3 three
4 four
all:
select * from a
union all
select * from b
结果:
x y
1 one
2 two
2 two
3 three
1 one
2 two
4 four
corr:
select * from a
union corr
select * from b
结果:
x
1
2
3
4
except:只留下a中有b中没有的;
select * from a
except
select * from b
结果:
x y
3 three
all:
select * from a
except all
select * from b
结果:
x y
2 two
3 three
intersect:只要ab中都有的;
例子我就不写了,大家应该能联想到吧
outer union: 和union有点相似,但是大家看了结果就会发现,加了corr后,outer union是最像set 语句的;
proc sql;
select * from a
outer corr
select * from b;quit;
大家可以自己试试结果是什么;
另外有一点不知道大家注意到没有,前面三个可是没有区分变量的哦, x y 与x z 是默认相同的哦,所以这种用法不是很灵活,大家要小心使用。
(三)
最后再写一写关于建立table的问题吧,这个方面比较简单;
我把个人的理解写一下就好
create->insert->update->delete->alter
create 就是建立table
insert就是在table中添加行
update是在table中修改行
delete是在table中删除行
alter是修改列
主要就是这么一个过程
语法方面我就简单介绍一下,大家多用用应该就会很熟悉
create table as select variable from table1
是从table1中挑选变量到一个新的创建的table中
insert into table
set …
这是往table中添加变量
insert into table
values (…)
这两种用法的结果基本是一样的
大家可以自己试一试
update table
set variable1=variable1*1.7
把表中的变量1放大1.7倍
delete from table where …
将符合条件的行删除
alter主要有3种用法:add modify drop
add是添加列
alter table
add col num format=4.1 label=’…’
建立了一个数字型的新列
modify 是改变列的格式
alter table
modify col format=comma15.1
修改了col列的格式
drop 删除列
alter table
drop col1
删除掉了col1列
转载请注明:数据分析 » PROC SQL 的学习经验小结_sas proc sql