实习过或者有志于从事数据这一块的同学肯定都知道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