SAS BASE数分--常用SQL语句总结

2022-03-30 00:00:00 代码 变量 观测 输入 输出

这一次进行SQL语句的常用总结。SAS中的proc sql步骤与传统意义上的SQL语句还是有些不一样的地方,当然大体的思路是没有太大出入的。由于工具依然是SAS BASE所以在这里依然总结的是SAS中的proc sql步骤。proc sql步骤主要用于查询。

一,基本的查询步骤---常见的select子句

select 语句中的字句顺序:

select 你需要的变量字段名(必要)

from 来自哪一张表(必要)

where 对变量的观测进行筛选(如年龄》=25)(选择)

group by 按照什么变量分组(如按照性别分组)(选择)

having 分组之后只能用haveing对变量的观测进行筛选(选择)

order by 按照什么顺序(如年龄大小)(选择)这一次进行SQL语句的常用总结。SAS中的proc sql步骤与传统意义上的SQL语句还是有些不一样的地方,当然大体的思路是没有太大出入的。由于工具依然是SAS BASE所以在这里依然总结的是SAS中的proc sql步骤。

1.select+from子句

原数据集:SASHELP.CLASS(SAS自带数据集)


代码输入:

/*整句话的意思是,from从SASHELP.CLASS表中查询输出select这几个变量:*代表所有原数据集变量,后面的都是新增列(as后面是新增列的字段名)No1、NO2、Height_Square和BMI,输出到表CLASS中去。distinct 表示删除重复的观测。COUNT(*) as no1 用了一个count函数告诉我们一共有多少观测输出到新的字段no1(还有其他很多函数常用的有sum(),max(),min(),avg()返回非空值的平均值等等);加工的第二个变量NO2是指name非缺失的个数;加工的第三个变量Height_Square;加工的第四个变量是BMI,这个变量用的不是原数据中的变量,所以要括号括起来然后告诉SAS它用的是上面加工出来的个变量所以必须用CALCULATED作为要用的变量的前缀。后面的label 和 format是将对加工生成的变量的列属性进行定义,label标签,format输出格式,length字段长度等等。*/

SAS输出:


2.where子句

代码输入:

  • 比较算符:

算符 等价 定义

= EQ 相等

^= 、~=、<> NE 不等于

> GT 大于

< LT 小于

>= GE 大于等于

<= LE 小于等于

  • 条件运算符号:

between and 筛选指定字段在一定区域

contains 检查数据是否包含某个字符串

in 检查数据在自定义列表中

is missing 检查数据是否缺失

like 检查数据是否满足一种样式

SAS输出:


3.group by子句

代码输入:/*按照性别分组*/


4.having 子句

/*和where功能相似,的不同是它可以对分组后的数据进行筛选所以必须放在group by 的后面*/


5.order by 子句

order by 子句,进行排序,缺失值默认小于非缺失值/直接对计算的新列排序/可以对没有被选择的列排序

代码输入:

SAS输出:


6.常用的分组汇总

/*摘出男生的平均身高,女生的平均体重*/

代码输入:

SAS输出:


二,连接查询步骤

以上是对一张表的查询,接下来看两张表或者多张表的查询。这里需要说明一下,有时候在SAS中sql和DATA步骤处理数据的时候各有千秋,根据不同的需求同时灵活应用两者才是使得代码更优化,效率更高的捷径。

/*数据集准备,*/

data height(keep=name sex age height)

weight(keep=name sex age weight);

set sashelp.class;

run;

data height;

set height;

if name="威廉" then delete;

run;

data weight;

set weight;

if name="爱丽丝" then delete;

run;

输入的数据集:

个:

第二个:

/*1,内部连接:inner join只保留同时在两张表中的数据*/

代码输入:


SAS输出:

/*在这里需要注意的是缺失值对于关联是有影响的,所以在关联的时候不仅需要考虑是一对多多对一多对多还是一对一,并且要考虑关联的字段中是否缺失如果缺失要去掉缺失值。*/

/*2,左连接:left join保留from后的那张表的所有观测,以及关联上去的后面一张表的值*/

代码输入:

SAS输出:

/*3,右连接:right join保留join后的那张表的所有观测,以及关联上去的from后的那一张表的值*/

代码输入:

SAS输出:

/*4,完全外连接:保留两张表的所有观测*/

代码输入:

/*join与merge的区别结果在于多对多的情况。当关联键在A表中有重复在B表中也有重复的时候称为多对多关联。这时候merge关联出

来的结果是直接把B表横向拼接到A表,按照观测顺序拼接。而join结果是笛卡尔乘积,也就是说假如A表中有三个一样的ID,B表中

有两个一样的ID那么终的结果是6条这样的ID。*/

SAS输出:

三,子查询步骤

以上from的表都是已有的表,那么在查询过程中可能需要查询来源表示经过一次加工而生成的表,此时就可以用到子查询来完成操作。

/*准备数据*/

data height(keep=name sex height) weight(keep=name sex weight);

set sashelp.class;

run;

输入数据集:

个:

第二个:

/*1.选择体重大于100的同学的身高*/

代码输入:

SAS输出:

/*2.选择体重大于100的同学的身高*/

代码输入:

SAS输出:

/*3.选择不同性别体重大于100的同学的大小和平均身高*/

/*先合并再分组*/

代码输入:

SAS输出:

四,纵向合并查询步骤

对于两个数据集字段类型一样的数据集进行纵向合并。

/*********************************************合并查询***************************************************/

/*--两个查询的纵向合并,

产生非重复观测 union

产生重复观测 union all

产生属于个查询的观测,第二个查询公共部分会被排除掉 except

产生两个查询中公共部分的观测 intersect

对多个查询结果直接连接 outer union

*/


/*准备数据*/

data boy girl;

set sashelp.class;

if sex="F" or name="Henry" then output girl;

if sex="M" or name="Alice" then output boy;

run;

输入数据集:

个:

第二个:

/*1.union重复19条*/

代码输入:

SAS输出:

/*2.union all重复21条*/

代码输入:

SAS输出:

/*3.except除去了公共部分全是 M*/

代码输入:

SAS输出:

/*4.intersect只留下公共部分*/

代码输入:

SAS输出:

/*5.outer union直接随意连接*/

代码输入:

SAS输出:

/*6.产生非公共部分*/

代码输入:

SAS输出:

五,查询--创建更新修改表步骤

以下是讲述如何用SQL语句对表进行修改的语句

/****************************************************查询--创建更新修改表**********************************/

/*创建表 create table 任何其他的SAS语句都可以适当得用在SQL中*/

代码输入:

SAS输出:

/*1.用insert into--SET子句插入观测*/

代码输入:

SAS输出:

/*2.用DELETE子句删除观测行*/

代码输入:

SAS输出:

/*3.用alter--add增加列*/

代码输入:

SAS输出:

/*4.用update来填值*/

代码输入:

SAS输出:

/*5.用alter--modify修改列属性(但不能rename)--update--修改列值*/

代码输入:

SAS输出:



/*6.alter-- drop删除列*/

代码输入:

SAS输出:


SQL基础篇章就到这里了,下一次准备更新,SQL中的如何优化查询以及如何在SQL中使用SAS宏工具。借由此之后下下篇章再引出我的大BOSS--宏的编写!!!

相关文章