首页 /  学术天地 / 柯·学堂

【柯·学堂】SAS入门必备之浅谈PROC SQL

讯息发布时间:2019-10-25 09:18

SQL(Structured Query Language)是一种结构化查询语言,熟悉SQL语句,你的数据检索能力会有一个质的飞跃,本次文章内容部分借鉴《深入解析SAS这本书非常全,我会在介绍常用SAS查询语句的基础上融入一些个人使用小技巧,有兴趣的朋友可与和我交流。

  1. SQL检索数据

    SAS中,我们通过调用PROC SQL使用SQL,首先要明白,SAS术语SQL术语的区别,如下:

    SQL中,可以有若干个语句,语句间以分号隔开,单独处理,一个语句可能包若干个从句,从句间以空格隔开,首先我们来看看基本的查询语句

     


  2. 在第三行SELECT从句中,名称前可以不加库名,而在后续FROM从句中指定;可以使用*代表选择表中所有使用关键字AS对重命名;也可以重新定义列名称属性以及根据原表中的列生成新的列。

     

    扩展1:检查语法

    可以使用VALIDATE关键词与 NOEXEC选项用来检查语法,如下

检查SELECT语句的语法,列名的有效性,而不执行该查询

p PROC SQL;

p     VALIDATE

p     SELECT ……

检查各类SQL语句中无效的语法而不执行该语句

p PROC SQL NOEXEC;

p SELECT ……

 

扩展2:介绍一些其他SQL语句

     PROC SQL <option>;

         CREATE expression;        创建新表

         INSERT expression;         为表添加新行

         DESCRIBE expression;       显示表的属性

         DROP expression;          删除整个表、视图和索引

         UPDATA expression;        修改表已有行的数据

 

扩展3:按条件生成新列CASE表达式)

SELECT  column-1<,…column-n>

CASE  <case-operand>

WHEN when-condition THEN result-expression

<WHEN when-condition THEN result-expression>

<ELSE result-expression >

END< as column>

FROM table;

假定case-operand中比较运算符为等号的情况,效率更高

SELECT  column-1<,…column-n>

CASE 

WHEN when-condition THEN result-expression

<WHEN when-condition THEN result-expression>

<ELSE result-expression >

END< as column>

FROM table;

 

扩展4:日期常数的使用 

语法

用于

例子

‘ddMONyyyy’d

将日历日期转变成SAS日期

Data=’15JUN2008’d

 

扩展5:使用WHERE从句筛选子集

       对于新生成列,用户都必须在前面加上关键字CALCULATED”来表明该列是新生成的。

 

 

扩展6WHERE从句中常见的比较运算符、逻辑运算符

助记符

符号

定义

LT

<

小于

GT

>

大于

LE

<=

小于等于

GE

>=

大于等于

NE

<>   ^=

不等于

OR

|

AND

&

NOT

^

 

运算符

例子

IN

Where job in (‘a’,’b’,’c’)

CONTAINS or ?

Where word ?  ‘SAS’

IS NULL or IS MISSING

Where subjid is missing

BETWEEN – AND

Where height between 1.5 and 1.8

SOUNDS LIKE (=*)

Where name =*  ‘huimin’

 

扩展7:使用ORDER BY 从句排序


PROC SQL默认按照指定列的升序排列,若希望按降序排序,可在该列名后加上关键字DESC”ORDER从句允许用户按照多个列的升(降)序排列,多个列之间多逗号隔开 

 

扩展8:使用HAVING从句选择行

这样理解好记,WHERE从句的执行在SELECT从句前,而HAVING从句的执行在SELECTGROUP BY之后。因此,使用GROUP BY从句时,只能使用HAVING从句,用于决定选取哪些组,对于SELECT从句中新生成的列,则无需加关键字CALCULATED” 注意各个从句的位置是固定的,不能对调。


 

      SELECT语句的使用很灵活,除上面谈到的以外,我们还可以搭配一些函数如SCAN、FIND以及BOOLEAN表达式灵活使用,按需求生成新的变量。

 

  1. 子查询

子查询查询语句内部嵌套一个查询语句,按照嵌套的查询语句与原语句关联与否可分为相关子查询和不相关子查询。相关子查询:子查询与外查询相关,子查询成功执行前,外查询必须给子查询提供信息。不相关子查询:子查询与外查询无关这里我们重点介绍不相关子查询的工作原理:


可以看出PROC SQL会优先处理子查询,然后把值返回到外查询语句中进行处理。返回值用于外查询的WHEREHAVING子句,只能返回一列,能返回单个或多个值。


横向合并

    对多个表格进行合并(包括横向合并与纵向合并)的实质是对两个表格进行合并,因此我们这里仅讨论两个表格的情况。

    使用SQL对表进行横向合并可分为内连接(INNER JOIN)与外连接(OUTER JOIN),所谓的内连接指的是,在对表进行横向连接的时候,根据连接的条件,仅返回两个表中所有匹配的数据。外连接指的是输出两表内连接的行、以及部分来自其中一个表的行。

内连接替代语法一般形式为:

 

 

内连接只返回匹配行,当还需要包括非匹配的行时使用外连接。

外连接根据连接的方式可以分为左连接(LEFT JOIN)、右连接(RIGHT JOIN)、全连接(FULL JOIN),外连接的使用语法如下:

 

注意外连接一次只能处理两个表,是内连接的增强,返回内连接生成的所有行并加上其他行,看图理解

 思考使用PROC SQL 对表进行横向合并与DATA步合并(MERGE有什么不同?

 

  1. 纵向合并

    上节一样,我们这里也只考虑两个表的纵向合并,纵向合并的一般语法如下:

     


  2. 上述每个SELECT的用法与其在单表中的用法一样,即可在SELECT中添加其他从句,如WHEREGROUP BYHAVING

    可供选择的的连接方式(集合运算符)有:EXCEPTINTERSECTUNIONOUTER UNION等,它是对两个SELECT语句产生的结果集进行操作,而不是实际的表本身。注意EXCEPT INTERSECT UNION 列按位置匹配且必须是相同的数据类型,最终结果集的列名由第一个结果集确定,OUTER UNION两个结果集的所有列都被选中,看程序媛灵魂作图理解这里的合并逻辑: 

关键字ALL:输出在所有表A中但不在表B的行(包括表A中可能重复的行)

关键字CORR:基于表中列的名称对表进行纵向合并。

又有集合运算符,又有关键字,那么如何快速理解纵向合并呢?针对纵向合并连接方式,再来看一组程序媛的灵魂作图:

 

 

 

 

 

同样留个思考题:使用 SQL集合运算符进行表的纵向合并与DATA步(SET)有何区别欢迎讨论

        

技术支持 英铭科技