文章目录
- 前言
- 一、使用SQL检索数据
- 1.SQL的基本结构
- 2.列操作
- 2.1查询某列的值(select)
- 2.2列值更新(update)
- 3.行操作
- 3.1.distinct关键字
- 3.2.where从句
- 3.3.order从句
- 3.4.group by从句
- 3.5.having从句
- 3.6.insert into 插入行
- 3.7.delete 删除行
- 二、使用SQL进行数据表合并
- 1.横向合并
- 1.1.内连接
- 1.2.外连接
- 2.纵向合并
- 三、数据表的增删改
- 1.创建空表
- 2.删除表
- 3.修改表
- 总结
前言
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;
连接方式:
连接方法 | 作用 |
---|---|
except | A except B:A中有并且A不在B中 |
intersect | A intersect B:A中有并且A在B中 |
union | A union B:A和B都有,A表会覆盖B表 |
outer union | A 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语言,如何对数据表的创建,删除,修改,合并,以及如何对数据进行增删改查。
更多推荐
SAS笔记#SAS中的SQL语言
发布评论