首页 > 技术文章 > PROC SQL

yudan-chan 2020-12-10 15:36 原文

1.简单查询:

PROC SQL; 
    SELECT  列名1, 列名2,… FROM 数据集 WHERE 条件; 
RUN;

2.使用order by排序:

PROC SQL;
    SELECT 列名1, 列名2,… FROM 数据集  where 条件 ORDER BY 列名 DESC ;
RUN;

        (升序关键词:ASC;降序关键词:DESC)


3.连接查询:

ON后面的条件(ON条件)和WHERE条件的区别:

ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。

WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件;在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束;在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。

(只进行连接操作,WHERE只过滤中间表的记录)

连接运算符是用来实现多表联合查询的一种重要方式,主要分为三种:内连接、外连接、交叉连接。

3.1 内连接 INNER JOIN

内连接(INNER JOIN)有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

内连接使用比较运算符(包括=、>、<、<>、>=、<=、!> 和!<)进行表间的比较操作,查询与连接条件相匹配的数据。根据所使用的比较方式不同,内连接分为等值连接、自然连接和自连接三种。

语句1:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。

PROC SQL;
    INSERT INTO 新表名 (列名1,…,列名n) SELECT 列名1,…,列名n FROM 旧表 WHERE 条件;
RUN;

 

语句2:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

PROC SQL;
    SELECT 表1.列名1,表1.列名2,表2.列名1,表2.列名2 FROM 表1,表2 WHERE 表1.列名1=表2.列名1;
RUN;

eg:PROC SQL;SELECT A.*,B.* FROM A INNER JOIN B ON A.ID=B.PARENT_ID;RUN;(使用“=”关系将表连接起来的查询,其查询结果中列出被连接表中所有的列,包括其中的重复列)

4.查询结果放入一个新表中

    若表已存在:

PROC SQL;
    INSERT INTO 新表名 (列名1,…,列名n) SELECT 列名1,…,列名n FROM 旧表 WHERE 条件;
RUN;

 

    若表不存在:

PROC SQL;
    SELECT 表1.列名1,表1.列名2,表2.列名1,表2.列名2 FROM 表1,表2 WHERE 表1.列名1=表2.列名1;
RUN;

    PS:PROC过程步中不能使用sql server的into将结果放入新表中,因为sas会认为用户想要创建宏变量!

 

参考:1.https://www.cnblogs.com/arxive/p/10046556.html;2.http://blog.sina.com.cn/s/blog_6cbb9e310100wckd.html

推荐阅读