手把手教你医学统计-SAS 编程技巧 - PROC SQL(一)
SQL 全称 Strucured Query Language,即结构化查询语言,广泛应用于关系型数据库中。
SAS Base 使用 PROC SQL 提供了对 SQL 的实现。PROC SQL 过程可以帮助我们完成以下任务:
创建数据集、视图和索引
删除数据集、视图和索引
修改数据集的结构
修改数据集的观测
从数据集或视图中获取观测
从数据集或视图中合并观测
汇总统计
上述任务可以用四个字简要概括:增、删、改、查。
在这一节中,我们主要介绍如何使用 SQL 创建和删除数据集、视图和索引、修改数据集的结构,以及更新、新增和删除数据集中的观测。
创建数据集
使用 CREATE TABLE 语句可以创建一个数据集。例如:下述代码创建了一个包含若干变量的数据集,并定义了变量标签、输入格式、输出格式:
↑向右滑动查看全部代码↑
该数据集名称为 DM ,包含 3 个字符型变量和 3 个数值型变量。变量的定义包括变量名和变量类型,变量名可以是任何合法的 SAS 名称,变量类型可以是 CHARACTER 和 NUMERIC ,可以分别简写为 CHAR 和 NUM 。
运行后查看数据集 DM 属性:

CREATE TABLE 语句还支持基于现有数据集结构创建空白数据集,只需使用 LIKE 关键字即可:
上述代码将会创建一个名为 DM1 的数据集,其结构与数据集 DM 完全一致,但不含任何观测。
创建视图
视图本质上是一段 PROC SQL 的查询语句,本身并不包含任何数据集中的任何数据,当在 SAS 过程或 DATA 步中使用视图时,视图包含的查询语句将会自动执行。这意味着每次访问视图时,查询到的数据都有可能是不同的,即视图是动态更新的。
当某个查询语句被频繁使用时,可以为其创建视图,以供其他查询语句访问,而无需每次访问时编写重复的查询语句。
使用 CREATE VIEW 可以创建一个视图。例如:下述代码创建了一个视图,该视图查询了数据集 DM 中年龄 ≥ 60 岁的受试者信息。
注:上述代码使用了 SELECT 语句进行数据库的查询,我们将在未来的章节中介绍它。
创建索引
索引是一种数据结构,可以将其看做书的目录,它存储了指向特定观测的指针,以便可以通过指针快速定位特定数据。使用索引可以提高 PROC SQL 在特定情况下执行查询语句的效率。
索引又分为简单索引(simple index)和复合索引(composite index)。
简单索引:在一个变量上创建,索引名称必须与变量名相同;
复合索引: 在两个或多个变量上创建,索引名称不能与数据集中的任何变量名相同。
使用 CREATE INDEX 可以创建一个索引。例如:下述代码为数据集 DM 中的受试者唯一编号建立了索引。
复合索引适用于无法使用单一变量标识唯一观测的数据集(ADLB,ADAE等),例如:
在数据集属性信息的“索引”标签中可以查看已定义的索引信息:

删除数据集、视图、索引
使用 DROP 语句可以删除数据集、视图和索引。
删除操作需要注意以下问题:
1. 删除数据集或视图后,所有引用了该数据集或视图的视图都将失效;
2. 删除含有索引的数据集后,该数据集中的所有索引也将一并被删除;
3. 删除一个复合索引后,其所关联的变量都将失去该复合索引,但会保留其他索引。
修改数据集的结构
使用 ALTER TABLE 可以修改数据集的结构,包括增加、删除变量、修改变量属性,以及对数据完整性约束(integrity constraints)的操作。
数据完整性约束涉及到较高级的概念,我们将在未来的章节中介绍它,这一节我们只介绍对变量的增加、删除和修改操作。
新增变量
使用 ADD 子句可以新增一个或多个变量,我们可以在新增变量的同时指定变量的属性。
↑向右滑动查看全部代码↑

删除变量
使用 DROP 子句可以删除变量。
注意:删除某个变量时,使用该变量定义的索引(包括简单索引和复合索引)都将一并被删除。
修改变量属性
使用 MODIFY 子句可以修改变量的属性,用法与 ADD 子句类似。
↑向右滑动查看全部代码↑
上述代码修改了数据集 DM 中变量 RANDDT 和 SEX 的属性,分别将它们的输出格式修改为 e8601da10. 和 $sex. ,同时将变量 SEX 的长度修改为 10。
注意:ALTER TABLE 语句无法修改变量名,如需修改这些属性,请使用 CREATE TABLE 或 SELECT 语句间接完成,这将在未来的章节中进一步介绍。
更新数据集观测
使用 UPDATE 语句可以对数据集中的观测进行更新。 SET 子句指定更新的变量和数据, WHERE 子句指定筛选条件,符合 WHERE 条件的观测才会被更新。如果未指定 WHERE 子句,则会更新所有观测。
↑向右滑动查看全部代码↑
上述代码更新了数据集 DM 中所有已入组( RANDFL = "Y" )的受试者的体重指数(BMI)。
SET 子句可以指定 SQL 表达式作为更新后的值,但该 SQL 表达式不能包含逻辑运算符。有关 SQL 表达式的内容将在未来的章节中详细介绍。
新增数据集观测
使用 INSERT 语句可以在数据集中新增观测。 INTO 子句指定需新增观测的数据集名称,有两种新增观测的方式:使用 SET 或 VALUES 子句。
使用 SET 子句允许在为变量赋值时,无需考虑变量赋值的顺序;而 VALUE 子句在为变量赋值时,赋值顺序必须与 INSERT INTO 指定的变量顺序或变量在数据集中的顺序一致。
↑向右滑动查看全部代码↑
上述代码为数据集 DM 新增了 3 行观测,分别为 SET 子句新增的一条观测和 VALUES 子句新增的两条观测。
在新增观测时,INSERT 语句未指定但存在于数据集中的变量将会被赋予缺失值,若 INSERT 语句未指定任何变量,则相当于指定了数据集中的所有变量。例如,下述代码可以将一条完整的观测追加到数据集 DM 的最后一条观测中。
↑向右滑动查看全部代码↑
删除数据集观测
使用 DELETE 语句可以对数据集中的观测进行删除。 WHERE 子句指定筛选条件,符合条件的观测才会被删除。如果未指定 WHERE 子句,则会删除所有观测。
上述代码删除了数据集 DM 中所有未入组( RANDFL ^= "Y" )的受试者的观测。



