前言

SAS语言是支持SQL语言的,本文将介绍如何使用SAS SQL对数据进行检索,加工以及管理。


一、使用SQL检索数据

1.SQL的基本结构

proc sql;
	select 表1.字段名1,表1.字段名2,....
	from 表1
	<where>
	<group by>
	<order by>;
quit;	

注:SAS中sql语句只有结束时的一个分号。

2.列操作

2.1查询某列的值(select)

实例代码:

proc sql number outobs=10;
	select cars.make,cars.model from sashelp.cars;
quit;

部分结果:
在这里插入图片描述
分析:select语句后面只选择了make和model字段,from后面表明了是从sashelp.cars表获取数据,因此该sql语句查询的结果只有sashelp.cars表中的make,model两个字段。

2.2列值更新(update)

updata语法:

/*使用where筛选条件*/
proc sql;
	update 表名
	set 字段名1=新值1,字段名2=新值2, ...<where>
quit;

/*使用case筛选条件*/
proc sql;
	update 表名
	set 字段名1=
	case
	when 条件1 then 新值1
	when 条件2 then 新值2
	...
	end;
quit;

3.行操作

3.1.distinct关键字

对distinct后面所有的字段都会被去重处理,distinct使用结构:

select distinct 表名.列1, 表名.列2....

注:一个select语句中只能由一个distinct 。
实例代码:

proc sql number outobs=10;
	select cars.make,cars.model from sashelp.cars;
quit;

结果如下:
在这里插入图片描述

3.2.where从句

和Data步中where类似,来选择符合条件的行。
代码实例:

proc sql number;
	select cars.make,cars.model from sashelp.cars
	where cars.make="Acura";
quit;

结果如下:
在这里插入图片描述
分析:查询了make字段为Acura的数据。
注:如果在查询时生成了新的字段,此时where不能直接对新的字段编写条件去查询,需要在新的字段前加关键字calculated来表明该列是新生成的。
在这里插入图片描述
这里的新列为tax,使用where从句时,对产生的新列没有进行说明系统会报错。

3.3.order从句

对所选择的列进行升序会降序,order的基本使用结构:

oeder by 列1<desc>,列2<desc>...

注:desc表明为降序,当字段后面啥也没有写时,系统默认为对字段进行升序操作。
示例:
在这里插入图片描述

3.4.group by从句

goup by类似于tabulate过程中的class,用来查看分组信息。

proc sql outobs=10;
	select cars.make,count(distinct model) as num
	from sashelp.cars
	group by make;
quit;

在这里插入图片描述
分析:对make进行分组,对每一个make中的model进行去重计数。
注:group by语句一般和汇总函数结合使用。
下面列举了一些常见的汇总函数及其含义

函数含义
max最大值
min最小值
avg平均值
count计数
nmiss缺失值个数
range最大值和最小值之差(极差)
var方差
std标准差
sum求和

3.5.having从句

having从句和where从句一样,也是选择特定条件的行,having是对查询之后结果再进行一次条件筛选,往往用在group by后面,对分组之后的数据再进行条件筛选。
代码示例:

proc sql outobs=10;
	select cars.make,count(distinct model) as num
	from sashelp.cars
	group by make having num>10;
quit;

结果如下:
在这里插入图片描述
分析:该次查询生成了一个新列num,前面使用where时,对于新列需要用关键字calculated说明,而使用having时不需要说明,也侧面说明了having是对分组之后的数据进行的条件筛选,因为分组之后的数据中已经有num字段了,再进行having从句进行条件筛选不算是新的字段了。

3.6.insert into 插入行

insert into基本结构:

/*  set插入  */
proc sql;
	insert into 表名
	set 字段名1=内容1
		字段名2=内容2
		...;
quit;

/*  values插入  */
proc sql;
	insert into 表名 (字段名1,字段名2, ...)
	values (内容1, 内容2, ...)
	...;
quit;

注:values后面的插入内容要与前面的字段对应。
实例代码:

proc sql;
	insert into new_class
	set name='A',
	sex='M',
	height=79,
	weight=100
	set name='B',
	sex='F',
	height=109,
	weight=120;
quit;

结果如下:
在这里插入图片描述

3.7.delete 删除行

delete基本用法:

proc sql;
	delete from 表名 <where 删除的条件>
quit;

二、使用SQL进行数据表合并

1.横向合并

1.1.内连接

对两个进行合并的表,根据连接条件,返回两个表中所有的匹配数据。
实例代码:

proc sql;
	select c.name, c.sex, c.age, c.height, cfit.weight
	from work.class as c, work.classfit as cfit
	where c.name=cfit.student_name;
quit;

结果:
在这里插入图片描述

1.2.外连接

外连接语法:

proc sql;
	select 列1, 列2...
	from 表A 连接方式 表B;
quit;

外连接的三种方式

连接条件含义
左连接(left join)A left join B:AB都有的记录m和A除去m剩下的记录
右连接(right join)A right join B:AB都有的记录m和B除去m剩下的记录
全连接(full join)A full join B:AB都有的记录m和A除去m剩下的记录以及B除去m剩下的记录

2.纵向合并

语法:

proc sql;
	select * from 表A 
	连接方式 <all> <corr>
	select * from 表A;
quit;

连接方式:

连接方法作用
exceptA except B:A中有并且A不在B中
intersectA intersect B:A中有并且A在B中
unionA union B:A和B都有,A表会覆盖B表
outer unionA outer union B:根据字段名直接合并,两表之间不会覆盖

注:纵向合并时默认去重,如要不去重可使用all,同时合并时只需要两张表的字段数据类型相同即可合并,合并后的数据表的字段名默认以第一张数据表的字段名为准,如要以两张表相同字段名纵向合并可使用corr。all和corr可以同时使用。
以union为例:
在这里插入图片描述

三、数据表的增删改

1.创建空表

proc sql;
create 表名 
	(
	字段名1 数据类型1,
	字段名2 数据类型2,
	字段名3 数据类型3,
	...
	)
;
quit;

实例代码:

create table new_class
	(
	name char(12) label='姓名',
	sex char(4) label="性别",
	age num label="年龄",
	height num label="身高",
	weight num label="体重"
	)
;
quit;

也可以使用like复制已存在的表的结构来创建空表,like的使用结构

proc sql
	create table 空表名
	like 已存在的表名
quit;

创建一个和new_class一样的空表new_class1,代码如下:

proc sql
	create table new_class1
	like new_class;
quit;

2.删除表

proc sql;
	drop table 表名;
quit;

3.修改表

proc sql;
	alter table 表名
	add 列1 数据类型,列2 数据类型 /*新增列*/
	drop 列1, 列2 /*删除列*/
	modify 列名 数据类型;  /*修改列属性*/
quit;

如删除new_class中的age字段,添加adress地址字段,并将weight改为质量,代码如下:

proc sql;
	alter table new_class
	add adress char(10) label="地址"
	drop age
	modify weight num label='质量';  
quit;

结果如下:
在这里插入图片描述

总结

本文主要介绍了在SAS中使用SQL语言,如何对数据表的创建,删除,修改,合并,以及如何对数据进行增删改查。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐