天软编写类语法_第1页
天软编写类语法_第2页
天软编写类语法_第3页
天软编写类语法_第4页
天软编写类语法_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据语言班类SQL语法一、类SQL的查询语句TS-SQL的Select语句与SQL中的Select语句相类似,但是又有许多特色和差异。TS-SQL中Select语句的基本语法如下:Select [Distinct] [Drange(<BegtoEnd|MOfN>)] <SelectList返回的内容> <From子句> [Where查询限定子句] [GroupBy分组条件子句] [Having分组条件子句] [OrderBy次序表达式[ASC|DESC]] End下面分别对各个关键字进行说明:SeleteTS-SQL中除支持以Select开始Select查询语句外,还支持SSELECT,MSELE和VSELECT三个关键字做SELECT查询。

使用MSELECT查询时,返回的结果类型为Matrix类型;

使用VSELECT时,直接可返回数据的值;

使用SSELECT时,返回结果为一个一维数组。

Distinct当在TS-SQL中使用了Distinct时,即表示指定在结果集中只能显示唯一行。为了DISTINCT关键字的用途,空值被认为相等。不指定DISTINCT则指定在结果集中可以显示重复行。Drange

当只需要返回部分结果集时,例如只需要返回结果集中的前N条记录,在传统SQL中可用TOPN关键字来实现,而TS-SQL不提供TOPN,但是提供了更为方便灵活的Drange关键字。DRange的用法是DRange(BegIndextoEndIndex),和数组的下标一样,索引号也是从0开始的,如果我们要返回最后的10条,我们可以用负数来代表倒数,-1表示最后一条,-2表示倒数第二条,例如DRange(-10to-1)就代表了最后的十条。DRange还有另外一个用法,就是等分法,例如我们要把数据集分成十等分,我们返回第一等分的内容,也就是返回前10%的内容,则可以用DRange(1Of10)来表示。返回的内容Select查询返回的内容除了可以是原数据集中的内容之外,还支持计算,允许调用TSL支持的各类函数。

当返回原数据集的内容时,采用[]符号来访问原数据集的内容,[]中加入的是字段的下标,字段下标可以是常量,也可以是变量。对于整数下标的数据集,用[0]表示下标为0的列,对于字符串下标的数据集,则在[]中加入对应的字符串下标即可。例如,在传统的SQL中,假如有一个名为abc的字段,那么[abc]则表示访问该字段,而在TS-SQL中却例外,需要以[“abc”]来访问,[abc]表示的是变量,你也可以先给abc赋值为”abc”,再使用[abc]来访问该列。

当有多个返回内容时,不同的返回内容之间用逗号(英文输入状态下半角符号)进行间隔,*则代表原数据集的所有列。

每个返回的内容可以使用As列名来标示返回的字段列,也可以省略,一旦省略,Select会自动安排列名(如果返回内容是[]表达式,则列名则和原列名保持一致,否则列名会自动用"Expr1","Expr2"..替代),As后的列名可以是字符串,也可以是整数。例如[0]As[“示例”]表示返回下标为0的列,并将返回的列名指定为”示例”。聚集函数

聚集函数用于对一组值执行计算并返回单一的值。经常会与GroupBy字段共同使用。为了与其他TSL函数区分开,TS-SQL的聚集函数通常是在传统SQL的聚集函数的基础上加上Of,例如AvgOf、SumOf。

TS-SQL支持时间序列,可以利用RefOf访问前几条的数据,也可以求移动的N条的统计,例如AvgOf([“close”],true,30),表示对收盘价求移动30日平均。此外,还支持条件聚集,例如AvgOf([”close”],[”close”]>[”open”])就是对收盘大于开盘的求平均数,同时还支持条件聚集加移动,例如AvgOf([”close”],[“close”]>[”open”],30)就是对收盘大于开盘的最近30个收盘求平均。TS-SQL还支持多字段聚集返回,例如AvgOf(*)则一次返回每个字段聚集的结果,这里值得注意的是需要在()内前后各加一空格,这是因为TSL语法中支持以(*作为注释符,因此需要加以区分。

在利用多字段聚集的时候,同样支持条件聚集,用AggValue可以返回当前聚集的字段的值。例如:AvgOf(*,AggValue>10)则表示求每个字段大于10的平均数。当然也可以用Avgof(*,AggValue>10,20)来求符合的移动平均。聚集函数

CountOf统计个数SumOf和CountIfOf统计符合的个数MinOf最小值GeoMeanOf集合平均MaxOf最大值HarMeanOf调和平均AvgOf均值MedianOf中值SkewOf偏度,兼容表格计算ModeOf众值TotalVarOf总体样本方差和StdevOf样本标准偏差ProuductOf累乘StdevpOf总体样本标准偏差LargeOf最大值VarOf方差SmallOf最小值VarpOf总体样本方差RankOf排名AvedevOf平均绝对偏差NormOf平方和的平方根DevsqOf样本平均值偏差的平方和Skew2Of偏度2,兼容MKurtosis2Of峰度2,兼容NQuartileOf四分位Checksum_AggOf校检TrimMeanOf内部平均值PercentileOf百分位AggOf自定义聚集PercrntRankOf百分排位FrequencyOf求频个数From子句From后面接的是所查询的数据集的名字,即原数据集。一般情况下,简单的查询如返回数据集中的某一列时,都只需要接一个表名即可,但在某些情况下需要使用到复杂查询时,可以使用Join关键字处理多表联接查询。

Where子句Select...from...结果集之后,允许在后面接Where关键字以及查询条件。例如Where[0]>10表示查询条件为下标为0的列中值大于10的项。

当有多个查询条件时,不同的条件间用And或Or隔开,分别表示且与或。GroupBy子句

GroupBy子句用于对查询的内容进行分组,假设原数据集成绩表Grade中有[“性别”]字段与[“分数”]字段,那么SelectAvgOf([“分数”])FromGradeGroupBy[“性别”]End;表示根据性别分组,分别统计男女同学的平均分。如果是多个值的分组,则在不同的值间用逗号隔开即可。Having子句Having子句用于对分组后的结果进行筛选,仍使用上一节的例子,SelectCountOf([“分数”])FromGradeGroupBy[“性别”]Having[“分数”]>90End;表示根据性别分组,分别统计男女同学中分数大于90分的人数。

值得注意的是,需要区分Having与Where子句的区别。Having可以用聚集函数作为条件,而Where是不行的,Having是先GroupBy分组再计算Having条件,而Where则是最先开始进行条件筛选。在Groupby之前是允许有Where条件的。OrderBy

OrderBy关键字用于对返回的结果集进行排序,只需在OrderBy的后面接上字段名,即表示根据该字段的值进行排序,默认是从小到大进行排序,也支持从大到小排序。Orderby后的排序表达式之后允许跟Asc或者Desc来描述排序的方向,缺省为正序(Asc可以省略),而Desc则代表逆序(OrderBy[...]Desc),并且orderby之后支持多个排序,多个排序表达式和排序方向之间使用逗号进行分割。End

与传统SQL不同,TS-SQL语句以End关键字作为结束,这是因为,TSL语法是使用;作为语句结束符号的,如果Select语句也使用;,那么在用Select语句进行赋值时,例如A:=Select*FromB;;第一个;是Select语句的结束,第二个分号则是:=赋值语句的结束,这样会使得语句变得难以看懂,且过多的分号在使用中容易混淆也容易遗漏,且显得不够简洁,因此以End作为Select语句的结束符。二、TS-SQL的数据更新

Update更新语句

Update语句用于对结果集中符合条件的值进行更新。

语法:Update结果集Set字段名=更新值[Where子句]End;

语法结构很简单,Update之后Set之前是需要更新的结果集,在Set之后用[FieldName]=Value的模式将值更新给符合条件的行的FieldName字段,而条件则和Select一样使用Where子句,其中Where子句可以省略。Delete删除语句

Delete语句用于删除结果集中符合条件的行。

语法:Delete…From结果集[Where子句];

表示删除结果集中符合Where子句中条件的记录,同样的,Where子句可以省略。Insert插入语句

Insert语句用于在结果集中添加数据。

语法:InsertInto结果集[InsertFields指定插入的字段]Values(...);

表示在指定结果集中插入Values的值,可以指定插入的字段位置,也可以不指定,当不指定时则表示按Values后接的值顺序插入。三、多表连接查询当查询的对象为多个表时,可以用到多表连接查询。不同表间可以用Join,LeftJoin,RightJoin,FullJoin,CrossJoin来进行连接,其中除了CrossJoin之外,其他都支持On或者With条件约束。Join上表分别为结果集A、B,通过Join连接,可以得到一个同时具备学号,姓名,英语成绩的结果集:R:=select[1].*,[2].["英语成绩"]fromAjoinBon[1].["学号"]=[2].["学号"]end;学号姓名01张三02李四03王五04赵六05钱七学号英语成绩018002600490035005882.LeftJoin,RightJoin,FullJoinLeftJoin是以左结果集为基准,如果右结果集缺乏满足和左结果集中的某行联接的条件的行,那么依旧保留一条左结果集中的行,而联接的右结果集假定为空(所有字段的值为NIL)。在案例中返回的结果中包括所有A结果集中的学生,而没有成绩的学生保留为空。

RightJoin的用法可以完全参照LeftJoin,不同在于,RightJoin是以右边的结果集作为基准的。FullJoin也可以参照LeftJoin和RightJoin,不同之处是结合了LeftJoin和RightJoin,在在Join的结果集中增加了左右结果集中未能在Join结果集内的行,其处理规则和LeftJoin类同。R:=select["学号"],[1].["英语成绩"],[2].["俄语成绩"]fromAfulljoinBon[1].["学号"]=[2].["学号"]end;除了同时修两门外语的人有两门成绩,否则只有一门成绩有内容,而另外一门成绩为空。学号英语成绩016402540375学号俄语成绩0172028304943.CrossJoin在进行表联接的时候,我们可能需要的是一个笛卡尔积,这种情况下我们可以采用crossjoin,这样可以得到多结果集所有行的完整排列组合。crossjoin不支持on语法,但是支持where子句。我们一样可以用crossjoin来替代join语句。

R:=select[1].*,[2].["英语成绩"]fromAjoinBon[1].["学号"]=[2].["学号"]end;

可以用下面的语句替换:R:=select[1].*,[2].["英语成绩"]fromAcrossjoinBwhere[1].["学号"]=[2].["学号"]end;

Crossjoin还有另外一种写法,就是用逗号“,”替换corssjoin:R:=select[1].*,[2].["英语成绩"]fromA,Bwhere[1].["学号"]=[2].["学号"]end;四、平台演示演示1:利用Join实现表的连接查询Beginstocks:=array("SZ000002","SZ000001","SZ000898");Data:=array();fori:=0tolength(stocks)-1dobeginStockid:=stocks[i];setsysparam(pn_stock(),StockId);setsysparam(pn_date(),EndT);N1:=TradeDays(BegT,EndT);Data1:=NDay(N1,"t",DateToStr(sp_time()),StockId,close());ifnotlength(Data)thendata:=Data1elseData:=select*,["t"]fromdatafulljoindata1with([1].["t"]on[2].["t"])end;end;returndata;End;演示2:利用Select语句提取数据1//提取万科A(SZ000002)在2014年中每一交易日的收盘价和成交量BeginArrr:=selectdatetimetostr(["date"])as"date",["close"],["vol"]frommarkettabledatekey20140101Tto20141231T+0.999of‘SZ000002’end;ReturnArr;End演示3:利用Select语句提取数据2//提取所有A股在2014年中每一交易日的开盘价和收盘价BeginStkArr:=Getbk('A股');StkArr:=select["StockID"],datetimetostr(["date"])as"date",["close"],["open"] frommarkettabledatekey20140101Tto20141231T+0.999OfStkArrend;ReturnStkArrEnd演示4:SQL的移动计算Begin//5为移动的个数a:=selectdatetostr(["date"])as"date",["vol"],avgof(["vol"],true,5)as"五日平均成交量",avgof(["vol"],["close"]>refof(["close"],1),5)as"最近五个收盘>昨日收盘的日的平均成交量“frommarkettabledatekeyBegTtoEndTofStockIdend;

//带条件的平均默认是先判定,后移动,使用SelectOpt(64)使得移动平均的时候,先移动,后判定,这样,一定是在5日内对符合条件的进行平均c:=selectselectopt(64)avgof(["vol"],["close"]>refof(["close"],1),5)as"最近五日中收盘>昨日收盘的平均成交量"frommarkettabledatekeyBegTtoEndTof"SZ000002"end;

returna|c;End;演示5:利用ThisOrder获得排名//获得排序的真实序号,必需和orderby一起用a:=array(1,2,9,3,4,5,88,33,2,4,7,3,2,1,1,3);returnselectthisorderas"order",thisrowas"value"fromaorderbythisrowend;演示6:利用Group实现分组与聚集//将演示3中所获得的数据按日期进行分组,统计每日上涨的股票数量BeginStkArr:=Select[‘date’],CountIfOf([‘close’]>[‘open’])as'上涨数量'FromStkArrGroupBy[‘date’]end;End演示7:多列聚集BeginArr:=Rand(100,Array(“A”,”B”,”C”));r:=SelectMaxOf(*,AggValue>0)FromArrEnd;//各列中>0的值的最大值Returnr;End演示8:利用ThisGroup访问分组的内容//将演示3中所获得的数据按股票进行分组存放BeginStkArr:=Select["StockID"],select*fromthisgroupendas"Details"FromStkArrGroupBy["StockID"]end;End演示9:利用Refsof访问上一级的SelectBegin a:=array(1,2,9,20,30); b:=array(1,2,9,99,7,22,10); c:=selectthisrow,vselectminof(thisrow)fromb wherethisrow>refsof(thisrow,1)endfromaend; Returnc;End演示10:OederBy排序//提取在2014年12月31日这一天收盘价最高的十只股票BeginStkArr:=Getbk('A股');StkArr:=select["StockID"],["close"]frommarkettable datekey20141231Tto20141231T+0.999OfStkArrend;StkArr:=SelectDRange(0to9)*FromStkArrOrderBy["close"]DescEnd;ReturnStkArrEnd五、上机实验练习1:用Select语句提取出万科(sz000002)在2010年1月1日到今天中,收盘价大于上一个交易日收盘价的日期和对应的收盘价和涨跌幅(今日收盘除以昨日收盘),除权为1,除权基准日为2010年1月1日。将上述数据保存到myresult数组中。练习2:用Update操作把MyResult数组中的涨跌幅更新为涨跌幅百分比练习3:用Delete函数把涨跌幅百分比小于5%的数据删除。练习4:把"SZ000002","SZ000001","SZ000898"这3个股票的20100101T到20100501T之间的收盘价分别取出在3个二维数组中,然后用join语法将它们合并为同一张二维数组。练习5:调用selectsampledata(1)函数得到一个6列的二维数组,为这个二维数组多创建6列,分别为按这6列排序练习6:提取万科A(SZ000002)在2014年中涨幅最高的10天练习7:统计2014年每天下跌股票的比例练习8:提取所有A股在2014年中每天的开盘价、收盘价,并按日期分组存放练习9:提取万科A(SZ000002)在2014年中每天的开盘价与收盘价,并对开盘价正序排序,然后再对收盘价逆序排序练习10:提取2014年12月31日所有A股的成交量,并从大到小进行排序获得排名

六、上机实验答案练习1:FunctionTest();BeginSetsysparam(pn_rate(),1);Setsysparam(pn_RateDay(),20100101T);MyResult:=Select['date'],['close'],(['close']/refof(['close'],1)-1)as'涨跌幅'FrommarkettableDateKey20100101TtoSp_Time()Of"SZ000002"whereRefOf(['close'],1)<['close']End;returnMyResult;End;练习2:UpdateMyResultSet['涨跌幅']=FloattoStr(['涨跌幅']*100)+'%'end;练习3:DeleteFromMyResultWhere['涨跌幅']<0.05;练习4:

Functionjointest();Beginbegt:=20100101T;endt:=20100501T;stocks:=array("SZ000002","SZ000001","SZ000898");Data:=array();Fori:=0tolength(stocks)-1dobeginStockid:=stocks[i];setsysparam(pn_stock(),StockId);setsysparam(pn_date(),EndT);N1:=TradeDays(BegT,EndT);Data1:=NDay(N1,"t",DateToStr(sp_time()),StockId,close());ifnotlength(Data)thendata:=Data1elseData:=select*,["t"]fromdatafulljoindata1with([1].["t"]on[2].["t"])end;end;returndata;End;练习5:Functionorderbytest();Begindata:=selectsampledata(1);cols:=MCols(data,true);fori:=1tolength(Cols)-1dobegindata:=select*,thisRowIndexascols[i-1]+'order'fromdataorderby[cols[i]]end;ifi=length(Cols)-1thendata:=select*,thisRowIndexascols[i]+'order'fromdataend;end;returndata;End;练习6BeginArr:=selectdatetimetostr(["date"])as"date",["close"]-["open"]as"涨幅"frommarkettabledatekey20140101T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论