楼主: intheangel
77419 83

[原创博文] PROC SQL 的一点小结   [推广有奖]

  • 3关注
  • 89粉丝

VIP

副教授

25%

还不是VIP/贵宾

-

威望
1
论坛币
49842 个
通用积分
6.1883
学术水平
152 点
热心指数
168 点
信用等级
122 点
经验
12931 点
帖子
480
精华
0
在线时间
475 小时
注册时间
2013-11-22
最后登录
2023-6-28

初级热心勋章

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
实习过或者有志于从事数据这一块的同学肯定都知道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 ...)我就不一一详细介绍了,感兴趣的同学可以去书里看看,都介绍的很清楚,有什么问题可以和我一起讨论一下,不行可以去请教大神们;


书的地址:https://bbs.pinggu.org/thread-2972382-1-1.html
数据集的地址:https://bbs.pinggu.org/thread-3026450-1-1.html

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:proc sql ROC sql condition Procedure 英文版 文章 能力

已有 8 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
eijuhz + 20 + 2 + 2 精彩帖子
小明12345 + 1 + 1 + 1 精彩帖子
--墨子-- + 5 奖励积极上传好的资料
feifeifeidm + 3 精彩帖子
zqy12666 + 1 + 1 + 1 观点有启发
李会超 + 36 精彩帖子
webgu + 60 + 60 + 2 + 2 + 2 鼓励积极发帖讨论
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 216  论坛币 + 65  学术水平 + 9  热心指数 + 6  信用等级 + 4   查看全部评分

本帖被以下文库推荐

我是一只瘦瘦的小猪~~~
╭︿︿︿╮
{/-◎◎-/}
( (oo) )
  ︶︶︶
沙发
intheangel 学生认证  发表于 2014-5-3 13:43:47 |只看作者 |坛友微信交流群
(二)
根据我去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 是默认相同的哦,所以这种用法不是很灵活,大家要小心使用。

已有 4 人评分经验 学术水平 热心指数 信用等级 收起 理由
李下蹊666 + 4 + 5 精彩帖子
feifeifeidm + 3 + 3 + 3 太棒了,看着非常简介易懂
heguima + 1 + 1 + 1 精彩帖子
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 100  学术水平 + 8  热心指数 + 9  信用等级 + 4   查看全部评分

我是一只瘦瘦的小猪~~~
╭︿︿︿╮
{/-◎◎-/}
( (oo) )
  ︶︶︶

使用道具

藤椅
congmu 发表于 2014-5-3 14:12:08 |只看作者 |坛友微信交流群
谢谢分享

使用道具

板凳
lookslike 发表于 2014-5-3 14:58:38 |只看作者 |坛友微信交流群
顶顶,谢谢分享。

使用道具

报纸
intheangel 学生认证  发表于 2014-5-3 17:45:44 |只看作者 |坛友微信交流群
(三)
最后再写一写关于建立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列
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
heguima + 1 + 1 + 1 精彩帖子
crackman + 100 鼓励积极发帖讨论

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

我是一只瘦瘦的小猪~~~
╭︿︿︿╮
{/-◎◎-/}
( (oo) )
  ︶︶︶

使用道具

地板
lqwoailuo 发表于 2014-5-4 08:47:40 |只看作者 |坛友微信交流群
赞一个!!!

使用道具

7
ynaktank 发表于 2014-5-4 08:48:13 |只看作者 |坛友微信交流群
不错啊,楼主的精神真是值得学习,年轻有为。谢谢

使用道具

8
slimdell 发表于 2014-5-4 13:47:36 |只看作者 |坛友微信交流群
不错,支持
知乎专栏/微信公号同名:煮酒烹茶读书

使用道具

9
wsddzr 发表于 2014-5-5 12:02:52 |只看作者 |坛友微信交流群
先谢谢LZ了~ 回头好好看看

使用道具

10
appleqiuqiu 发表于 2014-5-5 17:32:53 |只看作者 |坛友微信交流群
赞楼主!!!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 06:02