660 likes | 1.05k Views
第三讲 查询语言 SQL. 金融学院 冯建芬 博学楼 913, 64495048 danxin_97@yahoo.com.cn. 内容提要. SQL 过程与 SQL 语言简介 SQL 语言简介 SQL 过程简介 SQL 中的语句及其作用 从单个表中查询和加工数据; 利用 select 语句处理和加工数据; 创建新表存储查询结果; 从多个表中查询和拼接数据; 从多个数据表查询数据实例. 涉及章节. 《SAS 编程技术教程 》 第十九、二十、二十一章 《SASV8 基础教程 》 第六章 帮助目录:
E N D
第三讲 查询语言SQL 金融学院 冯建芬 博学楼 913, 64495048 danxin_97@yahoo.com.cn
内容提要 • SQL过程与SQL语言简介 • SQL语言简介 • SQL过程简介 • SQL中的语句及其作用 • 从单个表中查询和加工数据; • 利用select 语句处理和加工数据; • 创建新表存储查询结果; • 从多个表中查询和拼接数据; • 从多个数据表查询数据实例
涉及章节 《SAS编程技术教程》 第十九、二十、二十一章 《SASV8基础教程》第六章 帮助目录: SAS productsBase SASSAS SQL过程用户指南 SAS productsBase SASSAS过程过程SQL过程
本讲目的 SQL是一种强大的查询语言,用它可以简化挑选和处理数据的程序。本讲的目的是: 掌握SQL过程的简单应用; 会使用SQL查询语句处理单个数据集和多个数据集的查询; 会使用SQL查询语句进行简单的求和、求均值等运算
3.1 SQL过程与SQL语言简介 参见第十九章.
SQL的英文全称是Structured Query Language, 翻译成汉语为“结构化查询语言”,是在关系型数据库中广泛使用的一种标准化查询语言,通常使用它对数据表和基于表的数据视图进行查询和加工。(SQL术语中的表即为SAS术语中的数据文件(数据集、数据视图、索引) 一、SQL语言
二、SQL过程 在SAS中可以使用SQL过程调用SQL语言,实现以下功能: • 读入、展示和加工SAS数据文件(数据集和数据视图); • 在数据集中增加和修改数据值; • 增加、修改和删除数据文件中的变量; • 合并表和视图中的数据; • 建立表、视图和索引; • 生成报告;
SQL过程的简单形式 Proc SQL; 查询表达式 其中查询表达式规定展示的数据和处理数据的 方式
PROC SQL特点 • 因为PROC SQL继承了SQL,所以和其它SAS过程步有一定的区别。 1) PROC SQL持续运行直至遇到QUIT语句、DATA步,或其它SAS过程。因此,不用在每个SQL语句中重复PROC SQL。 例3.1:列出data.stk000001的2002年以后的date、stkcd值,列出data.stk000002的收盘价大于开盘价的记录的date、oppr,clpr, clpr-oppr的值, 令distance=clpr-oppr, 查询结果按照date升序输出。
procsql; select stkcd,date from data.stk000001 where year(date)>=2002; select date, oppr,clpr,clpr-oppr as distance from data.stk000002 where clpr>oppr order by date; quit; 例中有两个SQL语句,每个语句用分号结束,写 第二个语句之前只有没有退出SQL环境,就可以 不用再加proc sql;来声明。
2) SQL 过程语句在一句话中有多个从句,实现不同的功能。 在例3.1中,第一个SQL语句包含:select从句、from从句和where从句; 第二个SQL语句还包含 as从句和 order by从句。 3) SELECT语句在检索数据的同时会在输出窗口输出数据,使用NOPRINT选项可以阻止该项输出。 在没有为查询到的结果指定数据集的情况下,SQL将查询结果直接输出到输出(output)窗口.
4) 用ORDER BY语句可以代替SORT过程来完成排序。 5) RUN语句在PROC SQL语句中不起作用。
三、SQL中的语句及其作用 • SQL过程中最主要、最常用的就是Select语句,使用SELECT语句可以识别、检索和操作表中的数据: • 展示查询结果; • 让数据以一定格式显示; • 将报告在output窗口输出; • 另外为了将查询结果输出到数据集,需要用creat语句,在creat语句中,select语句就称为它的从句。 • SQL语言还有许多其他语句,这里不再介绍,可参考 帮助目录: Base SASSAS过程过程SQL过程
Select语句的格式 SELECT<DISTINCT> object-item <, ...object-item> <INTO macro-variable-specification <, ... macro-variable-specification>> FROM from-list <WHERE sql-expression> <GROUP BY group-by-item <, ... group-by-item>> <HAVING sql-expression> /*见SQL过程帮助*/ <ORDER BY order-by-item <, ... order-by-item>>;
Select语句中的子句顺序是有严格规定的: Select /*设定查询变量*/ From /*给出数据来源*/ Where /*列出查询需要满足的条件*/ Group by /*查询结果分组*/ Having /* 跟在group by之后,限定分组条件*/ Order by /*给出查询结果的排序变量,将结果按排序变量排序*/
Creat 语句格式 Creat table table-names as+select语句
3.2 从单个表中查询和加工数据 参考章节:第二十章,第二十二章
3.2.1利用select 语句处理和加工数据 一、SELECT 子句(20.2节) • 语句格式 SELECT <DISTINCT> object-item <, ...object-item> FROM from-list
Select 子句应用 • 选择所有列 例3.2 :选择数据集data.dret的所有列输出 proc sql outobs=3; select * from data.dret; 注:* 可以代表数据源中所有的列
选择特定列 语句格式: Select column-name from from-list 例3.3输出data.lstkinfo中的股票代码(stkcd)和股票名称(lstknm)。 proc sql; title '股票代码和名称'; select stkcd,lstknm from data.lstkinfo; quit;
剔除查询结果中的重复观测 • 语句格式: • <Keywords>=distinct 例3.4输出data.yrret中不同的股票代码,并输出相应的股票名称。 proc sql; select distinct stkcd, lstknm /*distinct指一条记录中的被选变量值不完全相同*/ from data.yrret; quit;
计算新列值 例3.5计算股票每日成交金额。 proc sql outobs=3; title'Trading Sum'; select stkcd, lstknm, clpr*trdvol format=12.2 from data.qttndist; quit;
为列分配别名 • 语句格式:SELECT calculation-form <as> <column name> • 别名必须符合SAS名称要求,别名只在当前的查询中有效。 例3.6 proc sql outobs=3; title 'Trading Sum'; select stkcd, lstknm, clpr*trdvol as trdsum format=12.2 from data.qttndist; quit;
CALCULATED 语句 例3.7 proc sql outobs=3; select stkcd,lstknm,date,clpr*mcfacpr as adjpr format 8.2, (calculated adjpr*trdvol) as trdsum format 12.2from data.qttndist; quit; • 语句格式:Calculated Column-name • 使用别名引用一个计算过的列值时,必须使用Calculated 关键词,并将Calculated放在列名称之前,以此告知PROC SQL这个列是经计算得到的。
二、WHERE从句(20.4节) • 可以对输出变量的观测进行条件选择,可以以选中的列为条件,也可以以未选择的列为条件。 • 语句格式 • WHERE sql-expression • 选项说明: sql-expression (见sql-expression定义). Sql-expression可以是:常数、列变量名、 SAS函数、汇总函数、SAS表达式等
Where从句的应用 例3.8用WHERE语句选择1991年以前上市的股票。 proc sql; select lstknm, lstdt from data.lstkinfo where lstdt<'31dec1991'd; quit;
例3.9使用IN算符用法。 procsqloutobs=3; select lstknm, stkcd from data.lstkinfo where stkcd in ('000001' '600651' '000004'); quit;
例3.10使用BETWEEN-AND算符选择满足一定范围的观测。例3.10使用BETWEEN-AND算符选择满足一定范围的观测。 proc sql; select * from resdat.lstkinfo where lstdt between '1jan1991'dand'31dec1991'd; quit;
例3.11使用匹配算符LIKE选择观测。 proc sql; select stkcd,lstknm from resdat.lstkinfo where lstknm like'ST%'; quit;
三、ORDER BY语句排序 • 可以对表中的观测进行排序,被排序的列可以是select子句的列、被计算出的列和没有被选择的列。 • 语句格式 ORDER BY order-by-item <ASC|DESC><, ... order-by-item <ASC|DESC>>;
选项说明: order-by-item 可以是如下:
按指定的变量排序 例3.12对股票上市时间列进行排序。 procsql outobs=3; select lstknm,lstdt from data.lstkinfo order by lstdt; quit;
按指定列在SELECT子句中的整数位置排序。 例3.13按第4列排序 proc sqloutobs=3; select stkcd,lstknm,date,clpr*mcfacpr as adjpr format 8.2 from data.qttndist order by 4 desc; /*等价于order by adjpr desc*/ quit;
课堂实践任务 • A)从data.exchbdqttn_1中选择债券代码、日期、债券名称、收盘全价、收盘净价、净价成交金额、成交笔数,并生成year、 qtr、 month三个变量,存储日期的年、季、月,年限范围为2000年至2010年; b)将上述结果存储到数据集ex.3_1中; c)对数据集ex.3_1按照年、季、月排序; d).删除ex.3_1中成交笔数为0和收盘净价缺失的数据,将剩余结果保存到数据集ex.3_2中
课堂实践任务 2.将数据集ex.3_2中的数据导出到excel表格ex3_2.XLS 3. 查询data.exchbdqttn_1中所有不同的股票代码;
四、使用汇总函数汇总数据 • 使用汇总函数(summary function)可以产生数据的统计量。
使用SUM函数 例3.14使用sum函数计算深发展历年派发现金红利总额。 procsql; select sum(dividend) format=8.2as totledv from data.stk000001; quit; /*注:这里的sum()是计算一个变量所有观测的加和,而data步中的sum(x1,x2)是求不同变量的当前记录加和。*/
语句格式: Select count(distinct <column-name>) as <new column-name> 观测数汇总 例3.15 a)统计在data.qttndist中有多少不同的stkcd procsql; title 'Number of different stkcd'; select count(distinct stkcd) as number from data.qttndist; Quit;
b) 统计data.lstkinfo中有Lzipcd为非缺失值的记录个数 procsql; select count(lzipcd) as number from data.lstkinfo; Quit; c)统计data.lstkinfo中的记录个数 procsql; select count(*) as number from data.lstkinfo; Quit;
使用avg求平均值 例3.16 求计算列的平均值 Procsql; Select clpr*trdvol as avgpr, avg(calculated avgpr) as total from data.stk000001; quit; 另一方法: Procsql; Select avg(clpr*trdvol) as total from data.stk000001; quit;
五、使用GROUP BY子句进行分组汇总 • 设定分组标志,并将观测进行分组。同时使用汇总函数时,将分组对数据进行汇总;当没有汇总函数时,等同于order by。 • 语句格式 <GROUP BY group-by-item <, ... group-by-item>> group-by-item选项说明:
例3.18分组进行汇总 a)对data.monret中的monret分股票求2005年的月收益均值 procsql; title'2005年股票月收益平均值'; select stkcd, avg(monret) from data.monret where'1jan2005'd<=date<='31dec2005'd group by stkcd; quit;
B)order by 对分组后结果进行排序 procsql; title'2005年股票月收益平均值'; select stkcd, avg(monret) as amret from data.monret where'1jan2005'd<=date<='31dec2005'd groupby stkcd; order by calculated amret desc; quit;
六、用HAVING子句选择分组数据 • 对group by的分组,挑选出满足条件的组输出。 • (where放在group by前,对组选择不起作用) • 语句格式 <HAVING sql-expression>
例3.19算出A股市场股票2005年的交易天数。 procsql; select stkcd,count(*) as trday from data.dret where'1jan2005'd<=date<='31dec2005'd group by stkcd having substr(stkcd,1,1) in ('0','6') or substr(stkcd,1,2)='99'; quit;
例3.20列出2005年交易天数不小于240天的股票 procsql; select stkcd,count(*) as trday from data.dret where '1jan2005'd<=date<='31dec2005'd group by stkcd having calculated trday>=240; quit;
3.2.2 创建新表存储查询结果 从查询结果创建表,使用create table语句,格式为: CREATE TABLE table-name AS query-expression
例3.21用Create Table语句从股票信息表创建的查询结果表。 procsql outobs=3; create table stkinfo as select stkcd, lstknm, lstdt from data.lstkinfo; quit;
3.3 从多个表中查询和拼接数据 参见第二十一章