1 / 66

第三讲 查询语言 SQL

第三讲 查询语言 SQL. 金融学院 冯建芬 博学楼 913, 64495048 danxin_97@yahoo.com.cn. 内容提要. SQL 过程与 SQL 语言简介 SQL 语言简介 SQL 过程简介 SQL 中的语句及其作用 从单个表中查询和加工数据; 利用 select 语句处理和加工数据; 创建新表存储查询结果; 从多个表中查询和拼接数据; 从多个数据表查询数据实例. 涉及章节. 《SAS 编程技术教程 》 第十九、二十、二十一章 《SASV8 基础教程 》 第六章 帮助目录:

efuru
Download Presentation

第三讲 查询语言 SQL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三讲 查询语言SQL 金融学院 冯建芬 博学楼 913, 64495048 danxin_97@yahoo.com.cn

  2. 内容提要 • SQL过程与SQL语言简介 • SQL语言简介 • SQL过程简介 • SQL中的语句及其作用 • 从单个表中查询和加工数据; • 利用select 语句处理和加工数据; • 创建新表存储查询结果; • 从多个表中查询和拼接数据; • 从多个数据表查询数据实例

  3. 涉及章节 《SAS编程技术教程》 第十九、二十、二十一章 《SASV8基础教程》第六章 帮助目录: SAS productsBase SASSAS SQL过程用户指南 SAS productsBase SASSAS过程过程SQL过程

  4. 本讲目的 SQL是一种强大的查询语言,用它可以简化挑选和处理数据的程序。本讲的目的是: 掌握SQL过程的简单应用; 会使用SQL查询语句处理单个数据集和多个数据集的查询; 会使用SQL查询语句进行简单的求和、求均值等运算

  5. 3.1 SQL过程与SQL语言简介 参见第十九章.

  6. SQL的英文全称是Structured Query Language, 翻译成汉语为“结构化查询语言”,是在关系型数据库中广泛使用的一种标准化查询语言,通常使用它对数据表和基于表的数据视图进行查询和加工。(SQL术语中的表即为SAS术语中的数据文件(数据集、数据视图、索引) 一、SQL语言

  7. SQL术语与SAS术语对应表

  8. 二、SQL过程 在SAS中可以使用SQL过程调用SQL语言,实现以下功能: • 读入、展示和加工SAS数据文件(数据集和数据视图); • 在数据集中增加和修改数据值; • 增加、修改和删除数据文件中的变量; • 合并表和视图中的数据; • 建立表、视图和索引; • 生成报告;

  9. SQL过程的简单形式 Proc SQL; 查询表达式 其中查询表达式规定展示的数据和处理数据的 方式

  10. 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升序输出。

  11. 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;来声明。

  12. 2) SQL 过程语句在一句话中有多个从句,实现不同的功能。 在例3.1中,第一个SQL语句包含:select从句、from从句和where从句; 第二个SQL语句还包含 as从句和 order by从句。 3) SELECT语句在检索数据的同时会在输出窗口输出数据,使用NOPRINT选项可以阻止该项输出。 在没有为查询到的结果指定数据集的情况下,SQL将查询结果直接输出到输出(output)窗口.

  13. 4) 用ORDER BY语句可以代替SORT过程来完成排序。 5) RUN语句在PROC SQL语句中不起作用。

  14. 三、SQL中的语句及其作用 • SQL过程中最主要、最常用的就是Select语句,使用SELECT语句可以识别、检索和操作表中的数据: • 展示查询结果; • 让数据以一定格式显示; • 将报告在output窗口输出; • 另外为了将查询结果输出到数据集,需要用creat语句,在creat语句中,select语句就称为它的从句。 • SQL语言还有许多其他语句,这里不再介绍,可参考 帮助目录: Base SASSAS过程过程SQL过程

  15. 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>>;

  16. Select语句中的子句顺序是有严格规定的: Select /*设定查询变量*/ From /*给出数据来源*/ Where /*列出查询需要满足的条件*/ Group by /*查询结果分组*/ Having /* 跟在group by之后,限定分组条件*/ Order by /*给出查询结果的排序变量,将结果按排序变量排序*/

  17. Creat 语句格式 Creat table table-names as+select语句

  18. 3.2 从单个表中查询和加工数据 参考章节:第二十章,第二十二章

  19. 3.2.1利用select 语句处理和加工数据 一、SELECT 子句(20.2节) • 语句格式 SELECT <DISTINCT> object-item <, ...object-item> FROM from-list

  20. Select 子句应用 • 选择所有列 例3.2 :选择数据集data.dret的所有列输出 proc sql outobs=3; select * from data.dret; 注:* 可以代表数据源中所有的列

  21. 选择特定列 语句格式: Select column-name from from-list 例3.3输出data.lstkinfo中的股票代码(stkcd)和股票名称(lstknm)。 proc sql; title '股票代码和名称'; select stkcd,lstknm from data.lstkinfo; quit;

  22. 剔除查询结果中的重复观测 • 语句格式: • <Keywords>=distinct 例3.4输出data.yrret中不同的股票代码,并输出相应的股票名称。 proc sql; select distinct stkcd, lstknm /*distinct指一条记录中的被选变量值不完全相同*/ from data.yrret; quit;

  23. 计算新列值 例3.5计算股票每日成交金额。 proc sql outobs=3; title'Trading Sum'; select stkcd, lstknm, clpr*trdvol format=12.2 from data.qttndist; quit;

  24. 为列分配别名 • 语句格式: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;

  25. 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这个列是经计算得到的。

  26. 二、WHERE从句(20.4节) • 可以对输出变量的观测进行条件选择,可以以选中的列为条件,也可以以未选择的列为条件。 • 语句格式 • WHERE sql-expression • 选项说明: sql-expression (见sql-expression定义). Sql-expression可以是:常数、列变量名、 SAS函数、汇总函数、SAS表达式等

  27. Where从句的应用 例3.8用WHERE语句选择1991年以前上市的股票。 proc sql; select lstknm, lstdt from data.lstkinfo where lstdt<'31dec1991'd; quit;

  28. 例3.9使用IN算符用法。 procsqloutobs=3; select lstknm, stkcd from data.lstkinfo where stkcd in ('000001' '600651' '000004'); quit;

  29. 例3.10使用BETWEEN-AND算符选择满足一定范围的观测。例3.10使用BETWEEN-AND算符选择满足一定范围的观测。 proc sql; select * from resdat.lstkinfo where lstdt between '1jan1991'dand'31dec1991'd; quit;

  30. 例3.11使用匹配算符LIKE选择观测。 proc sql; select stkcd,lstknm from resdat.lstkinfo where lstknm like'ST%'; quit;

  31. 三、ORDER BY语句排序 • 可以对表中的观测进行排序,被排序的列可以是select子句的列、被计算出的列和没有被选择的列。 • 语句格式 ORDER BY order-by-item <ASC|DESC><, ... order-by-item <ASC|DESC>>;

  32. 选项说明: order-by-item 可以是如下:

  33. 按指定的变量排序 例3.12对股票上市时间列进行排序。 procsql outobs=3; select lstknm,lstdt from data.lstkinfo order by lstdt; quit;

  34. 按指定列在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;

  35. 课堂实践任务 • 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中

  36. 课堂实践任务 2.将数据集ex.3_2中的数据导出到excel表格ex3_2.XLS 3. 查询data.exchbdqttn_1中所有不同的股票代码;

  37. 四、使用汇总函数汇总数据 • 使用汇总函数(summary function)可以产生数据的统计量。

  38. 使用SUM函数 例3.14使用sum函数计算深发展历年派发现金红利总额。 procsql; select sum(dividend) format=8.2as totledv from data.stk000001; quit; /*注:这里的sum()是计算一个变量所有观测的加和,而data步中的sum(x1,x2)是求不同变量的当前记录加和。*/

  39. 语句格式: 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;

  40. 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;

  41. 使用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;

  42. 五、使用GROUP BY子句进行分组汇总 • 设定分组标志,并将观测进行分组。同时使用汇总函数时,将分组对数据进行汇总;当没有汇总函数时,等同于order by。 • 语句格式 <GROUP BY group-by-item <, ... group-by-item>> group-by-item选项说明:

  43. 例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;

  44. 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;

  45. 六、用HAVING子句选择分组数据 • 对group by的分组,挑选出满足条件的组输出。 • (where放在group by前,对组选择不起作用) • 语句格式 <HAVING sql-expression>

  46. 例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;

  47. 例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;

  48. 3.2.2 创建新表存储查询结果 从查询结果创建表,使用create table语句,格式为: CREATE TABLE table-name AS query-expression

  49. 例3.21用Create Table语句从股票信息表创建的查询结果表。 procsql outobs=3; create table stkinfo as select stkcd, lstknm, lstdt from data.lstkinfo; quit;

  50. 3.3 从多个表中查询和拼接数据 参见第二十一章

More Related