slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
第三讲 查询语言 SQL PowerPoint Presentation
Download Presentation
第三讲 查询语言 SQL

Loading in 2 Seconds...

play fullscreen
1 / 66

第三讲 查询语言 SQL - PowerPoint PPT Presentation


  • 311 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '第三讲 查询语言 SQL' - efuru


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

第三讲 查询语言SQL

金融学院 冯建芬

博学楼 913, 64495048

danxin_97@yahoo.com.cn

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

《SAS编程技术教程》

第十九、二十、二十一章

《SASV8基础教程》第六章

帮助目录:

SAS productsBase SASSAS SQL过程用户指南

SAS productsBase SASSAS过程过程SQL过程

slide4
本讲目的

SQL是一种强大的查询语言,用它可以简化挑选和处理数据的程序。本讲的目的是:

掌握SQL过程的简单应用;

会使用SQL查询语句处理单个数据集和多个数据集的查询;

会使用SQL查询语句进行简单的求和、求均值等运算

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

在SAS中可以使用SQL过程调用SQL语言,实现以下功能:

  • 读入、展示和加工SAS数据文件(数据集和数据视图);
  • 在数据集中增加和修改数据值;
  • 增加、修改和删除数据文件中的变量;
  • 合并表和视图中的数据;
  • 建立表、视图和索引;
  • 生成报告;
slide9
SQL过程的简单形式

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

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

slide12
2) SQL 过程语句在一句话中有多个从句,实现不同的功能。

在例3.1中,第一个SQL语句包含:select从句、from从句和where从句;

第二个SQL语句还包含 as从句和 order by从句。

3) SELECT语句在检索数据的同时会在输出窗口输出数据,使用NOPRINT选项可以阻止该项输出。

在没有为查询到的结果指定数据集的情况下,SQL将查询结果直接输出到输出(output)窗口.

slide13
4) 用ORDER BY语句可以代替SORT过程来完成排序。

5) RUN语句在PROC SQL语句中不起作用。

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

Base SASSAS过程过程SQL过程

select
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>>;

slide16
Select语句中的子句顺序是有严格规定的:

Select /*设定查询变量*/

From /*给出数据来源*/

Where /*列出查询需要满足的条件*/

Group by /*查询结果分组*/

Having /* 跟在group by之后,限定分组条件*/

Order by /*给出查询结果的排序变量,将结果按排序变量排序*/

creat
Creat 语句格式

Creat table table-names as+select语句

slide18
3.2 从单个表中查询和加工数据

参考章节:第二十章,第二十二章

3 2 1 select
3.2.1利用select 语句处理和加工数据

一、SELECT 子句(20.2节)

  • 语句格式

SELECT <DISTINCT> object-item <, ...object-item>

FROM from-list

select1
Select 子句应用
  • 选择所有列

例3.2 :选择数据集data.dret的所有列输出

proc sql outobs=3;

select *

from data.dret;

注:* 可以代表数据源中所有的列

slide21
选择特定列

语句格式:

Select column-name from from-list

例3.3输出data.lstkinfo中的股票代码(stkcd)和股票名称(lstknm)。

proc sql;

title '股票代码和名称';

select stkcd,lstknm from data.lstkinfo;

quit;

slide22
剔除查询结果中的重复观测
  • 语句格式:
  • <Keywords>=distinct

例3.4输出data.yrret中不同的股票代码,并输出相应的股票名称。

proc sql;

select distinct stkcd, lstknm /*distinct指一条记录中的被选变量值不完全相同*/

from data.yrret;

quit;

slide23
计算新列值

例3.5计算股票每日成交金额。

proc sql outobs=3;

title'Trading Sum';

select stkcd, lstknm, clpr*trdvol format=12.2

from data.qttndist;

quit;

slide24
为列分配别名
  • 语句格式: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
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从句(20.4节)
  • 可以对输出变量的观测进行条件选择,可以以选中的列为条件,也可以以未选择的列为条件。
  • 语句格式
  • WHERE sql-expression
  • 选项说明: sql-expression (见sql-expression定义).

Sql-expression可以是:常数、列变量名、

SAS函数、汇总函数、SAS表达式等

where
Where从句的应用

例3.8用WHERE语句选择1991年以前上市的股票。

proc sql;

select lstknm, lstdt from data.lstkinfo

where lstdt<'31dec1991'd;

quit;

slide28

例3.9使用IN算符用法。

procsqloutobs=3;

select lstknm, stkcd from data.lstkinfo

where stkcd in ('000001' '600651' '000004');

quit;

slide29
例3.10使用BETWEEN-AND算符选择满足一定范围的观测。例3.10使用BETWEEN-AND算符选择满足一定范围的观测。

proc sql;

select * from resdat.lstkinfo

where lstdt between '1jan1991'dand'31dec1991'd;

quit;

slide30
例3.11使用匹配算符LIKE选择观测。

proc sql;

select stkcd,lstknm from resdat.lstkinfo

where lstknm like'ST%';

quit;

order by
三、ORDER BY语句排序
  • 可以对表中的观测进行排序,被排序的列可以是select子句的列、被计算出的列和没有被选择的列。
  • 语句格式

ORDER BY order-by-item <ASC|DESC><, ... order-by-item <ASC|DESC>>;

slide32

选项说明:

order-by-item 可以是如下:

slide33
按指定的变量排序

例3.12对股票上市时间列进行排序。

procsql outobs=3;

select lstknm,lstdt from data.lstkinfo

order by lstdt;

quit;

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

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

slide36
课堂实践任务

2.将数据集ex.3_2中的数据导出到excel表格ex3_2.XLS

3. 查询data.exchbdqttn_1中所有不同的股票代码;

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

例3.14使用sum函数计算深发展历年派发现金红利总额。

procsql;

select sum(dividend) format=8.2as totledv

from data.stk000001;

quit;

/*注:这里的sum()是计算一个变量所有观测的加和,而data步中的sum(x1,x2)是求不同变量的当前记录加和。*/

slide39
语句格式:

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;

slide40
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;

slide41
使用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
五、使用GROUP BY子句进行分组汇总
  • 设定分组标志,并将观测进行分组。同时使用汇总函数时,将分组对数据进行汇总;当没有汇总函数时,等同于order by。
  • 语句格式

<GROUP BY group-by-item <, ... group-by-item>>

group-by-item选项说明:

slide43

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

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

<HAVING sql-expression>

slide46
例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;

slide47
例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
3.2.2 创建新表存储查询结果

从查询结果创建表,使用create table语句,格式为:

CREATE TABLE table-name AS query-expression

slide49
例3.21用Create Table语句从股票信息表创建的查询结果表。

procsql outobs=3;

create table stkinfo as

select stkcd, lstknm, lstdt

from data.lstkinfo;

quit;

slide51

在面向多个数据表的加工中,常用SQL进行数据表的匹配横向并接,使用SQL实现数据表的匹配并接并不需要将原有的数据集按匹配字段排序,而且匹配字段在不同的数据表中可以有不同的名称。在面向多个数据表的加工中,常用SQL进行数据表的匹配横向并接,使用SQL实现数据表的匹配并接并不需要将原有的数据集按匹配字段排序,而且匹配字段在不同的数据表中可以有不同的名称。

  • 为了用过程SQL拼接SAS数据集,必须
    • 在from从句中列举读入的数据集;
    • 用where从句说明行(观测)是如何匹配的
slide52
多表查询的简单应用

过程SQL实现两个表匹配并解的一般形式为:

Proc sql;

select列1, <列2,…>

from表1 temp-name1, 表2 temp-name2

where表1.变量=表2.变量;

例3.22表china与表 usa的简单连接程序:

procsql;

select * from data.china, data.usa;

quit;

slide54
使用表名或表的别名

通常的查询时会遇到两个表有相同名字的列,为了在引用时不产生混淆,需要在列名前加上表名或者表的别名。

slide55
例3.23.只对相同水平的运动员进行连接

中国队和美国队打乒乓球比赛,队员分成5个水平,每个水平的球员都要和对手同一水平的队员打一场比赛,基础表数据如下。

China Player

level china

0 c01

1 c02

2 c03

3 c04

USA player

level usa

1 u00

2 u01

2 u02

3 u03

4 u04

slide56

procsql;

select * from data.china, data.usa

where china.level=usa.level;

quit;

slide57
从多个表中查询数据

例3.24

为比较不同股票间的相对价格变化,从data.idx.399106中提取data.stk000001, data.stk000002, data.stk00004共有的交易日数据,存储在ex.price中,将data.idx.399106 ,data.stk000001 data.stk000002, data.stk00004的收盘价clpr分别改名为clpr0-clpr3,在ex.price中保存date,clpr0-clpr3。

slide58
使用子查询语句选择数据

例3.25. 从data.lstkinfo中挑选出股票代码在data.sampstk中的记录

procsql;

select stkcd,lstknm,lstdt from data.lstkinfo

where stkcd

in (select stkcd from data.sampstk);

quit;

merge join
MERGE语句和JOIN连接比较

所有行匹配无重复值情况

两个表中的by变量的值都相等且没有重复值的时候,可以使用一个内部连连接来产生同样的效果。

例3.26 BY变量值相等且没有重复值。

Table a Table b

code manager code Assitant

145 Max 145 Tracy

150 Jack 150 Yao

155 Paul 155 Chen

程序如下:

datamerge1;

merge a b;

by code;

run;

proc printdata=merge1 noobs;

title 'Table MERGE1';

run;

slide60

Merge在合并前的两个数据集已经按code排过序,而PROC SQL则不需要排序,下面程序给出和上面同样的结果。

procsql;

title 'Table MERGE1';

select a.code, a.manager, b.Assitant

from a, b

where a.code=b.code;

quit;

slide61
有重复值情况

当用来连接两个表的列变量或者BY组中有重复值时,Merge和Proc sql的处理方式有所区别。

例21.9 BY组中有重复值。

Table newone Table newtwo

code Manager code Assistant

145 Max 145 Jerry

145 Xam 145 Tracy

155 Paul 155 Chen

Data步

data merge3;

merge a b;

by code;

run;

proc print data=merge3 noobs;

title 'Table MERGE3';

run;

slide62

若用SQL,则会出现下面的结果:

Proc sql;

Title 'Table Merge3';

Select a.code, a.manager, b.assistant

From a full join b

On a.code=b.code;

quit;

slide63
课堂实践任务

1.利用数据集data.dret计算各股票日平均收益,并按平均收益进行排序

2. 对上次课堂实践中获得的ex.ex3_1按季度分组计算可转债总交易量和总成交金额,存储在数据集ex.sum_qtr中,该数据集应该还有年,季两个时间指标;

3.从data.lstkinfo中挑选出股票代码不在data.sampstk中的记录

slide64
作业

作业

  • 以2008年A股上市公司股票为样本,找出在2008年摘帽的公司 (即公司名称中ST被去掉的)
  • 2009年首次被ST的上市公司
  • 查找截止到2009年9月30日,一直没有被特别处理的股票。
  • 计算data.dret中各股票的月累计收益率,增加变量positive,若月累计收益率大于0,值为1,否则值为0.
slide65
作业

5. .试由以下的9种德国马克对美元汇率看跌期权和9种英镑对美元汇率的看跌期权产生81种组合。

一年期,DM/USD汇率的9种不同看跌期权的执行价格和成本

执行价格Kdm 成本 Cdm

0.66 0.085855

0.65 0.032191

0.64 0.020795

0.63 0.017001

0.62 0.013711

0.61 0.010851

0.60 0.008388

0.59 0.006291

0.55 0.001401

一年期,BP/USD汇率的9种不同看跌期权的执行价格和成本

执行价格 Kbp 成本 Cbp

1.30 0.137213

1.25 0.082645

1.20 0.045060

1.15 0.028348

1.10 0.016146

1.05 0.007860

1.00 0.003277

0.95 0.001134

0.90 0.000245

slide66
作业

6. 很多情况下,读者可能会综合数据库中多张表的内容,来更直观更方便地获得全面信息。比如,需要把同一公司的主要财务比率和财务指标放在一起来研究整个公司。

数据合并举例:

Is_old数据集:利润及利润分配表_旧准则。

Finind_Old数据集:财务指标_旧准则。

Scf_old数据集:现金流量表_旧准则。

需要把这三个表中的以下变量综合起来:

Is_old表:主营业务利润(Mopeprf),营业利润(Opeprf), 营业外收支净额=营业外收入Noperev -营业外支出Nopeexp,利润总额(Totprf),净利润

Finind_Old表:每股收益摊薄(EPS),流动比率(Currt),速动比率(Qckrt),资产负债率(Dbassrt),每股净资产(NetassPS),销售净利率(Netprfrt),每股经活动产生的现金流量净额(OpeCFPS),总资产周转率(次)(Totassrat),净利润(扣除非经常性损益后Netprfcut)

Scf_old表:经营活动产生的现金流量净额(NCFope),现金及现金等价物净增加额(NetincrCCE).