SAS中的SQL語句大全_第1頁
SAS中的SQL語句大全_第2頁
SAS中的SQL語句大全_第3頁
SAS中的SQL語句大全_第4頁
SAS中的SQL語句大全_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、SAS中的SQL語句完全教程之一:SQL簡介與根本查詢功能本系列全部內(nèi)容主要以? SQLProcessingwiththeSASSystem(CourseNotes) » 為主進(jìn) 行講解,本書是在網(wǎng)上下載下來的,但忘了是在哪個網(wǎng)上下的,故不能提供下載鏈 接了,需要的話可以發(fā)郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅 用于學(xué)習(xí),不得用于商業(yè)目的,否那么后果自負(fù).1SQU±程步介紹過程步可以實(shí)現(xiàn)以下功能:查詢SAS數(shù)據(jù)集、從SAS數(shù)據(jù)集中生成報(bào)表、以不同方式實(shí)現(xiàn)數(shù)據(jù)集合并、創(chuàng)立或 刪除SASt據(jù)集、視圖、索引等、更新已存在的數(shù)據(jù)集、使得SAS系統(tǒng)可以使用SQL語句、可

2、以和SAS的數(shù)據(jù)步進(jìn)行替換使用.注意,SQLM程步并不是用來代替SASB 據(jù)步,也不是一個客戶化的報(bào)表工具,而是數(shù)據(jù)處理用到的查詢工具.過程步的特征SQLM程步并不需要對每一個查詢進(jìn)行重復(fù)、每條語句都是單獨(dú)處理、不需要 print 過程步就能打印出查詢結(jié)果、也不用 sort過程步進(jìn)行排序、不需要run、要quit來 結(jié)束SQLM程步 過程步語句SELECT查詢數(shù)據(jù)表中的數(shù)據(jù)ALTER增加、刪除或修改數(shù)據(jù)表的列CREAT E創(chuàng)立一個數(shù)據(jù)表DELETE刪除數(shù)據(jù)表中的列DESCRIB E列出數(shù)據(jù)表的屬性DROP刪除數(shù)據(jù)表、視圖或索引INSERT對數(shù)據(jù)表插入數(shù)據(jù)RESET沒用過,不知道什么意思SELE

3、CT選擇歹U進(jìn)行打ERUPDAT E對已存在的數(shù)據(jù)集的列的值進(jìn)行修改2SQ溪本查詢功能語句根本語法介紹SELECT<DISTINCT>object-item<,.object-item>FROMfrom-list<WHEREsql-expression><GROUPBYgroup-by-item<,group-by-item>><HAVINGsql-expression><ORDERBYorder-by-item<,order-by-item>>這里SELECT指定被選擇的列FROM指定被查詢的表名

4、WHER E子數(shù)據(jù)集的條件GROUPBY各數(shù)據(jù)集通過group進(jìn)行分類HAVING根據(jù)GROUPBY變量得到數(shù)據(jù)子集ORDERB Y寸數(shù)據(jù)集進(jìn)行排序語句的特征選擇滿足條件的數(shù)據(jù)、數(shù)據(jù)分組、對數(shù)據(jù)進(jìn)行排序、對數(shù)據(jù)指定格式、一次最多查詢32個表.這里還要提到的就是,在 SAS系統(tǒng)中,對于表名和變量名一般不超過 32個字符,對于庫名,文件引用名,格式等不能超過8個字符關(guān)鍵字Validate關(guān)鍵字只存在于select語句中、可以在不運(yùn)行查詢的情況下測試語句的語法、檢查列名是否合法、對于不正確的查詢將打印其消息.例:Iprocsql;2validate3selectRegion,Product,Sale

5、s 45whereRegion='Africa'NOTE:PROCS詢有有效語法.6quit;此外,我們還可以用noexec選項(xiàng)也可以用來進(jìn)行語法測試.例:7procsqlnoexec;8selectRegion,Product,Sales910whereRegion='Africa'NOTE由于NOEXEC項(xiàng),未執(zhí)行語句.11quit;這里提示未執(zhí)行,未提示錯誤,說明該語句沒有語法錯誤.但是如果參加一個表里 沒有字段,這里就會出現(xiàn)錯誤,例:12procsqlnoexec;13selectRegion,Product,Sales,test1415whereReg

6、ion='Africa'ERRORS下這些列在起作用的表中沒有找到:test.16quit;查詢列我們可以像那樣查詢指定列,也可以用*來查詢所有列.例:procsql;select*;quit;這里我們可以用feedback選項(xiàng)來查看到底我們選擇了哪些列:17procsqlfeedback;18select*19;NOTE:Statementtransformsto:520quit;這時(shí),我們可以看到從表中選擇了8個列消除重復(fù)值我們可以用distinct 選項(xiàng)來消除重復(fù)值.例如,我們要得到?jīng)]有重復(fù)的所有地區(qū)的名稱:procsql;selectdistinctRegionquit

7、;子集查詢比擬運(yùn)算符先列出where語句用到的比擬運(yùn)算符:LT<J、于GT次于EQ等于LE<=J、于或等于GE>關(guān)于或等于NE八不等于例如,我們要查詢sales大于100000的所有數(shù)據(jù):procsql;select*wheresales>100000;quit;:只要滿足in里的任意一個值,表達(dá)式即為真,例如,我們要選擇Region在Africa和EasternEurope的所有數(shù)據(jù):procsql;select*whereRegionin('Africa','EasternEurope');quit;邏輯運(yùn)算符OR成AND&:

8、NOT昨例如,選擇Region在Africa和EasternEurope ,且銷售額大于100000的所有數(shù)據(jù): procsql;select* whereRegionin('Africa','EasternEurope')andsales>100000;quit;或:判斷某列是否包含指定字符串例如,選擇列Region包含Afr '的數(shù)據(jù):procsql; select*whereRegion'Afr'quit;或ISMISSING判斷某列數(shù)據(jù)是否為空例如,如果找出Region為空的數(shù)據(jù):procsql; select*whereR

9、egionismissing;quit;注意,這里我們還可以用以下表達(dá)式對 where語句進(jìn)行替換.如果region為數(shù)值型 變量,那么可以用region=.,如果region為字符型變量,那么可以用region=''進(jìn)行 替換.:選擇某一區(qū)間的數(shù)據(jù)例如選擇sales大于100000,但小于200000的所有數(shù)據(jù):procsql;select* wheresalesbetween100000and200000;quit;:判斷是否能匹配某些字符例如,選擇以region以A開頭的所有地區(qū)procsql;select*whereRegionlike'A%'quit;

10、這里注意有兩類通配符,'可以通配任意個任意字符,只能通配一個任意字符:類似匹配這里由于里沒有符合要求的數(shù)據(jù),所有就用書上的例子說明一下吧:Wherelastname=* 'smith',出來的結(jié)果可能是:smith, smythe 等 表達(dá)式 我們可以通過已有的列進(jìn)行計(jì)算來得到新的列, 這時(shí)用關(guān)鍵詞as來給新的列賦列名, 例如:procsql;selectRegion,Product,Sales,Stores,Sales/Storesassalesperstores quit;這時(shí)結(jié)果就會多一列 salesperstores ,用來得到該地區(qū)該產(chǎn)品每個商店的平均銷售量.

11、這里要注意的是,在創(chuàng)立表達(dá)式時(shí),我們還可以在SQL里用到SAS中的除LAG和DIFF之外的所有函數(shù).這里我們還可以用表達(dá)式計(jì)算出來的結(jié)果來進(jìn)行子集查詢,但一定要記住用calculated關(guān)鍵詞.例如我們要找出商店平均銷售量大于5000的數(shù)據(jù):方法一:procsql;selectRegion,Product,Sales,Stores,Sales/StoresassalesperstoreswhereSales/Stores>5000;quit;方法二:procsql;selectRegion,Product,Sales,Stores,Sales/Storesassalesperstores

12、wherecalculatedsalesperstores>5000;quit;查詢結(jié)果展示數(shù)據(jù)排序默認(rèn)的排序方式是升序,我們可以用DES或鍵詞來進(jìn)行降序排列.例如以sales降序排列數(shù)據(jù):procsql;select* orderbySalesDESC; quit;這里提示一下,我們可以用任意多列進(jìn)行排序,包括表達(dá)式結(jié)果不用calculated , 但最好是選擇的列.與 FORMATLABEL改變輸出變量名的內(nèi)容FORMA T改變列的值的輸出方式例如,改變 salesperstores 的 label 和 formatprocsql;selectRegion,Product,Sales

13、,Stores,Sales/Storesassalesperstoreslabel='salesperstores'format=;quit;處理SQL用函數(shù)MEA破AVG均值COUNT N或FREQ非缺失值個數(shù)MAX最大值MIN:最小值NMISS缺失值個數(shù)STD標(biāo)準(zhǔn)差SUM求和VAR方差求和sum procsql;selectRegion,Product,Sales,Stores, sum(Sales,Inventory,Returns)astotal;quit;求均值avgprocsql;selectRegion,Product,Sales,Stores, avg(Sale

14、s)assalesavg;quit;分組求均值groupbyprocsql;selectRegion, avg(Sales)assalesavggroupbyRegion;quit;計(jì)數(shù)countprocsql;selectRegion,count(*)ascountgroupbyRegion;quit;數(shù)據(jù)子集procsql;selectRegion,count(*)ascountgroupbyRegionhavingcount(*)>50;quit;其它的就不多作介紹了,多用用就熟悉了子查詢找出regions 平均 sales 大于全部平均 sales 的regionprocsql;

15、selectRegion,avg(Sales)assalesavggroupbyRegionhavingavg(Sales)>(selectavg(Sales);quit;關(guān)鍵詞介紹>ANY(20,30,40)最終效果:>20<ANY(20,30,40)最終效果:<40=ANY(20,30,40)最終效果:=20or=30or=40例如, 選擇出 region 為 unitedstate 的 sales 小于任意 region 為 africa 的 sales的數(shù)據(jù)procsql;selectRegion,SaleswhereRegion='UnitedS

16、tates'andSales<any='Africa');quit;這個例子沒有多少意義,只是說明一下 any的用法關(guān)鍵詞介紹>ALL(20,30,40)最終效果:>40<ALL(20,30,40)最終效果:<20例如, 選擇出 region 為 unitedstate 的 sales 小于所有 region 為 africa 的 sales的數(shù)據(jù)procsql;selectRegion,SaleswhereRegion='UnitedStates'andSales<all='Africa');quit

17、;與 NOTEXISTSprocsql;select*whereexists (select*;quit;SAS中的SQL語句完全教程之二:數(shù)據(jù)合并與建表、建視圖SAS中的SQL語句完全教程之二:數(shù)據(jù)合并與建表、建視圖索引等本系列全部內(nèi)容主要以? SQLProcessingwiththeSASSystem(CourseNotes) » 為主進(jìn)行講解,本書是在網(wǎng)上下載下來的,但忘了是在哪個網(wǎng)上下的,故不能提供下載鏈 接了,需要的話可以發(fā)郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅 用于學(xué)習(xí),不得用于商業(yè)目的,否那么后果自負(fù).1連接joins 分為內(nèi)連接 innerjoins 和

18、夕卜連接 outerjoins內(nèi)連接:僅返回匹配的數(shù)據(jù),最多可以有32個表同時(shí)進(jìn)行內(nèi)連接外連接:返回所有匹配的數(shù)據(jù)和非匹配的數(shù)據(jù),一次只能有兩個表或視圖進(jìn)行外連接迪卡爾積:返回表內(nèi)所有可能的匹配情況.例如表 A有10*20的數(shù)據(jù),表B有30*40 的數(shù)據(jù),那么兩個表的迪卡爾積有(10+30) * (20+40) =40*60的數(shù)據(jù)我們先建立兩個數(shù)據(jù)集:datamarch;inputflight$3.+5datedate7.+3departtime5.+2orig$3.+3dest$3.+7miles+6boarded+6capacity;.;.;cards;21901MAR949:31LGAL

19、ON344219825062201MAR9412:19LGAFRA385720725013201MAR9415:35LGAYYZ366115178 27101MAR9413:17LGAPAR363513825030201MAR9420:22LGAWAS22910518011402MAR947:10LGALAX247511921020222MAR9410:43LGAORD74012021021902MAR949:31LGALON344214725013202MAR9415:35LGAYYZ36610617820223MAR9410:43LGAORD74011821021903MAR949:31L

20、GALON344219725062203MAR9412:19LGAFRA385718025027103MAR9413:17LGAPAR363514725020224MAR9410:43LGAORD74014821021904MAR949:31LGALON344223225062204MAR9412:19LGAFRA385713725013204MAR9415:35LGAYYZ36611717827104MAR9413:17LGAPAR363514625030204MAR9420:22LGAWAS22911518011405MAR947:10LGALAX247511721020225MAR941

21、0:43LGAORD74010421021905MAR949:31LGALON344216025062205MAR9412:19LGAFRA385718525013205MAR9415:35LGAYYZ36615717827105MAR9413:17LGAPAR363517725011406MAR947:10LGALAX247512821020226MAR9410:43LGAORD740115210 21906MAR949:31LGALON344216325013206MAR9415:35LGAYYZ36615017830206MAR9420:22LGAWAS2296618011407MAR9

22、47:10LGALAX247516021013207MAR9415:35LGAYYZ36616417827107MAR9413:17LGAPAR363515525030207MAR9420:22LGAWAS229135180;run;datadelay;inputflight$3.+5datedate7.+2orig$3.+3dest$3.+3delaycat$15.+2destype$15.+8delay;informatdatedate7.;formatdatedate7.;cards;11401MAR94LGALAX1-10MinutesDomestic820221MAR94LGAORD

23、NoDelayDomestic-562201MAR94LGAFRANoDelayInternational-5 13201MAR94LGAYYZ11+MinutesInternational14 30201MAR94LGAWASNoDelayDomestic-2 11402MAR94LGALAXNoDelayDomestic0 20222MAR94LGAORD1-10MinutesDomestic5 21902MAR94LGALON11+MinutesInternational1862202MAR94LGAFRANoDelayInternational0 13202MAR94LGAYYZ1-1

24、0MinutesInternational527102MAR94LGAPAR1-10MinutesInternational430202MAR94LGAWASNoDelayDomestic011403MAR94LGALAXNoDelayDomestic-120223MAR94LGAORDNoDelayDomestic-121903MAR94LGALON1-10MinutesInternational462203MAR94LGAFRANoDelayInternational-213203MAR94LGAYYZ1-10MinutesInternational627103MAR94LGAPAR1-1

25、0MinutesInternational230203MAR94LGAWAS1-10MinutesDomestic511405MAR94LGALAXNoDelayDomestic-220226MAR94LGAORDNoDelayDomestic-321906MAR94LGALON11+MinutesInternational2713206MAR94LGAYYZ1-10MinutesInternational730206MAR94LGAWAS1-10MinutesDomestic162207MAR94LGAFRA11+MinutesInternational2113207MAR94LGAYYZN

26、oDelayInternational-227107MAR94LGAPAR1-10MinutesInternational430207MAR94LGAWASNoDelayDomestic0;run;內(nèi)連接procsql;createtableinnerjoinsas selecta.*,b.* fromMarcha,Delayb =外連接 左連接leftjoin procsql;createtableleftjoinsasselect*fromMarchaleftjoinDelayb=右連接 rightjoin procsql;createtablerightjoinsas select*fr

27、omMarcharightjoinDelayb=全連接fulljoin procsql;createtablefulljoinsasselect*fromMarchafulljoinDelayb=迪卡爾積procsql;createtablecartesianasselecta.*,b.*fromMarcha,Delayb;quit;這里再大概說明一下內(nèi)外連接的實(shí)現(xiàn)的根本原理:首先生成兩個數(shù)據(jù)表的迪卡爾積, 然后再根據(jù)where語句來選擇符合條件的數(shù)據(jù)作為輸出結(jié)果.當(dāng)然,在實(shí)際處理過 程中,SQLM程步會對這個迪卡爾積的數(shù)據(jù)集進(jìn)行優(yōu)化,將其劃分成小塊數(shù)據(jù)進(jìn)行處理.2復(fù)雜的連接這里由于找不到很好

28、的例子來說明如何處理復(fù)雜的連接,因此就不講解了,大概說 一下思路吧:簡單地說,對于復(fù)雜的查詢,我們應(yīng)該將該查詢分解成幾個小的子查 詢,然后對每個子查詢的結(jié)果進(jìn)行測試,最后將所有的子查詢結(jié)合起來就組成了這 個復(fù)雜的查詢.這樣會比一來就寫復(fù)雜的查詢?nèi)菀椎枚?3數(shù)據(jù)集SET操作這里有四類 SETB作,分另fj是 EXCEPTINTERSECT UNION OUTERUNION EXCEP T得到除第二個數(shù)據(jù)集以外的所有第一個數(shù)據(jù)集里的數(shù)據(jù) INTERSECT得到第一個數(shù)據(jù)集和第二個數(shù)據(jù)集都有的數(shù)據(jù)UNION得到兩個數(shù)據(jù)集所有的數(shù)據(jù),這里如果兩個數(shù)據(jù)集有相同的數(shù)據(jù),重復(fù)數(shù)據(jù) 只出現(xiàn)一次OUTERUNI

29、O N導(dǎo)到兩個數(shù)據(jù)集所有的數(shù)據(jù).還有兩個關(guān)鍵詞來修改SETft作的彳亍為:ALL和CORRESPONDINGALL.:并不刪除重復(fù)值,不能與 OUTERUNION用注意,用ALL關(guān)鍵詞,一種情況 是你不管是否會有重復(fù)值,另一個情況是不可能出現(xiàn)重復(fù)值,例如有主鍵的數(shù)據(jù) CORRESPOND 1NG保存兩個數(shù)據(jù)集都有的字段,一般簡寫為CORR找出所有沒有延遲的航班和日期:procsql;selectflight,datefromMarchexceptselectflight,datefromDelay;quit;注意:這里重復(fù)值已經(jīng)被刪除.如果要得到所有的包含重復(fù)值的數(shù)據(jù),就要用到關(guān)鍵詞ALL:p

30、rocsql;selectflight,datefromMarchexceptALLselectflight,datefromDelay;quit;如果只保存兩個數(shù)據(jù)集都有的字段,那么用到關(guān)鍵詞CORRESPOND IN嗡寫為COR尺 procsql;select*fromMarchexceptCORRselect*fromDelay;quit;找出所有延遲的航班和日期:procsql;selectflight,datefromMarchINTERSECTselectflight,datefromDelay;quit;關(guān)鍵詞ALL和CORRESPONDING EXCEP并一樣,這里不再作介紹選

31、擇所有的數(shù)據(jù),這里的重復(fù)值只出現(xiàn)一次procsql;selectflight,datefromMarchUNIONselectflight,datefromDelay;quit;關(guān)鍵詞ALL和CORRESPONDING EXCEP并一樣,這里不再作介紹 procsql;selectflight,datefromMarchOUTERUNIONselectflight,datefromDelay;quit;這里,如果我們用到關(guān)鍵詞 CORR就可以將相同字段的數(shù)據(jù)結(jié)合到一起:procsql;select*fromMarchOUTERUNIONCORRselect*fromDelay;quit;4建表

32、建空表通過指定變量建空表procsqlnoprint;createtablepercent(varnamechar(30),Industrychar(4),begindatenumformatdate9.label='thebeginningdate',='theendingdate',P_1num,P_5num,P_95num,P_99num);quit;拷貝數(shù)據(jù)集來建空表procsqlnoprint;createtableDelaycopy(keep=flightdate) likeDelay;quit;查詢語句中,用outobs選項(xiàng)來建空表procsqln

33、oprintoutobs=0;createtableflight114asselect*fromDelay;quit;對數(shù)據(jù)表增加數(shù)據(jù)主要有三種方法:語句procsqlnoprint;insertintoflight114setflight='302',date='07MAR94'd,orig='LGA',dest=WAS',delaycat='NoDelay',destype='Domestic',delay=0;quit;語句procsqlnoprint;insertintoflight114value

34、s('271','07MAR94'd,'LGA','PAR','1-10Minutes','International',4);quit;條件查詢:建表和導(dǎo)入數(shù)據(jù)同時(shí)完成procsqlnoprint;createtableflight114asselect*fromDelaywhereflight='114'quit;5完整性約束完整性約束的好處是保證 SAS數(shù)據(jù)集的連續(xù)性和正確性,它在我們更新數(shù)據(jù)或插入 新的數(shù)據(jù)時(shí),驗(yàn)證新的數(shù)據(jù)是否符合該變量的約束條件.完整性約束需要以上版本,符合

35、ANSI標(biāo)準(zhǔn),可以在表建立時(shí)或表有數(shù)據(jù)后建立約束, 但不能被用于視圖,也不能用于低于版本的SAS系統(tǒng)建立的數(shù)據(jù)集.五大類完整性限制:NOTNULL CHECK UNIQUE PRIMARYKEYFOREIGNKEYNOTNUL L不許出現(xiàn)缺失值CHEC K指定該變量可以輸入哪些值UNIQUE每個值必須是唯一的,其值可以為空,但只能有一個值為空PRIMARYKE仕鍵,每個值必須是唯一且非空的FOREIGNKE健它表的主鍵,即外鍵,其值為關(guān)聯(lián)表的主鍵的值且非空例:procsqlnoprint;createtablepercent(varnamechar(30),Industrychar(4),be

36、gindatenumformatdate9.label='thebeginningdate',='theendingdate',percentnum,CONSTRAINTpercent_checkcheck);quit;這時(shí),如果我們插入的數(shù)據(jù)中,percent>1的話,將會出現(xiàn)錯誤.回滾 ROLLBACKS當(dāng)我們用INSERT UPDATE勺時(shí)候,操作要等到發(fā)生錯誤的時(shí)候才會停止,這時(shí)會出現(xiàn)一個問題,就是數(shù)據(jù)表的一些數(shù)據(jù)更新了,而另一些數(shù)據(jù)沒更新,這時(shí)如果我們要回到原來的狀態(tài),就需要用到 UNDO_POLICY項(xiàng)進(jìn)行回滾.UNDO_POLICY三個選項(xiàng):

37、REQUIRED缺省選項(xiàng),取消所有的更新或新插入的數(shù)據(jù).這里要注意的是,此操作不一定完全能成功.NONE阻止所有的與約束不符的更新或新數(shù)據(jù)OPTOINAL取消所有可以成功取消的更新或新插入的數(shù)據(jù)本功能用得很少,所以只是譯一下,請大家查閱相關(guān)文獻(xiàn).6創(chuàng)立視圖與索引視圖視圖最大的好處是它只是一個存儲的查詢,因此不包含任何數(shù)據(jù),這可以減少磁盤 的使用空間.其它的功能與數(shù)據(jù)庫的表類似.創(chuàng)立視圖語法:CreateViewView-nameasQuery-expression;例:procsqlnoprintoutobs=0;createViewdelayviewasselect*fromDelay;qu

38、it;索引語法:Create<unique>Indexindex-nameOntable-name(column-name,column-name);視圖和索引都用得很少,所以這里就不作講解了,大家查閱相關(guān)文獻(xiàn)吧.7維護(hù)表這里主要講一下如何更新或刪除已存在的表的數(shù)據(jù),如何對一個表增加、減少、或改變其列的屬性,如何刪除表、視圖和索引.更新數(shù)據(jù)這里主要用update來更新表的數(shù)據(jù),語法如下Updatetable-nameSetcolumn-name=expression,Setcolumn- name=expression,Whereexpression;注意,這里的where 一定要

39、寫清楚,如果沒有的話,那么會更新所有的數(shù)據(jù).例:procsqlnoprint;updatedelaysetdelaycat='Delay'wheredelay=0;quit;條件處理用CAS時(shí)句來實(shí)現(xiàn)條件處理.例如,對根據(jù) sales的大小進(jìn)行分類:語法:Selectcolumn Case<case-operand>Whenwhen-conditionthenresult-expression<Whenwhen-conditionthenresult-expression><elseresult-expression>End;例:procsq

40、l;createtableshoesrankasselect*,(casewhensales>100000then'good'else'bad'end)asrank;quit;刪除行語法:Deletefromtable-nameWhereexpression;例:procsql;DeletefromshoesrankWhereRegion='Africa'quit;改變列語法:AlterTabletable-nameAddcolumn-definition,column- definition,Dropcolumn-name,column-

41、 name,Modifycolumn-definition,column- definition,對已存在的數(shù)據(jù)表增加一個列:例:procsql;altertableshoesrankaddaddcolumnnumformat=,addcolumnmorechar(10);quit;從已存在的數(shù)據(jù)表中刪除列,例:procsql;altertableshoesrankdropaddcolumn;quit;修改某列的屬性,例:procsql;altertableshoesrankmodifyaddcolumnmorechar(20)label='modifyaddlabel'qui

42、t;刪除表、視圖、索引語法:DropTabletable-name,table- name,;DropViewView-name,View- name,;DropIndexindex-name,index- name,;Fromtable-name;例:procsql;droptableshoesrank;quit;SAS中的SQL語句完全教程之三:SQL過程步的其它特征SAS中的SQL語句完全教程之三:SQL過程步的其它特征本系列全部內(nèi)容主要以?SQLProcessingwiththeSASSystem(CourseNotes)為主進(jìn)行講解,本書是在網(wǎng)上下載下來的,但忘了 是在哪個網(wǎng)上下的,

43、故不能提供下載鏈接了,需要的話可以發(fā)郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅用 于學(xué)習(xí),不得用于商業(yè)目的,否那么后果自負(fù).前面兩局部內(nèi)容都比擬簡單,本節(jié)內(nèi)容才是本系列要介紹的重點(diǎn).不過這里裝的內(nèi)容都是點(diǎn)到即止,如果以后有時(shí)間,會進(jìn) 行更詳細(xì)地講解.1SQL過程步選項(xiàng)SQL過程步選項(xiàng)的作用主要是可以從更細(xì)節(jié)的方式去限制SQL過程步,并且可以在不執(zhí)行過程的情況下對程序進(jìn)行測試等.下面介紹一以下出來的選項(xiàng),這些選項(xiàng)大多經(jīng)常用到,更多的選項(xiàng)可以參考 SAS幫助.INOBS:進(jìn)行一個查詢時(shí),對每個源數(shù)據(jù)表進(jìn)行N行限制,僅對這N行的數(shù)據(jù)進(jìn)行查詢.OUTOBS :指定查詢輸出結(jié)果的觀測數(shù)LOOP

44、S:指定SQL過程步內(nèi)循環(huán)的次數(shù)(此選項(xiàng)我用得比擬少,誰明白的可以講一下,多謝)NOPROMPT和PROMPT:修改上述三個選項(xiàng)的效果,從而讓你選擇是否繼續(xù)或停止選項(xiàng)的效果.PRINT和NOPRINT:限制是否打印選擇的數(shù)據(jù)結(jié)果NONUMBER和NUMBER :限制是否在第一列打印觀測值編號DOUBLE和NOBOUBLE :輸入報(bào)表是否隔行顯示NOFLOW 和FLOW 和FLOW=n和FLOW=nm :指定列寬,n指定列寬,m指定行寬選項(xiàng)procsql double;selectflight,datefromMarchUNIONselectflight,datefromDelay;quit;選

45、項(xiàng)注意:這里inobs選項(xiàng)只讀取每個源表前10條數(shù)據(jù)進(jìn)行后續(xù)的操作,如下面的日志所示.兩個表都只讀取10條數(shù)據(jù)進(jìn)行關(guān)聯(lián),最后得到7條關(guān)聯(lián)好的數(shù)據(jù).237procsqlinobs=10;238createtabletmpas239selecta.*,b.*240fromMarcha,Delayb241=變量"flight已經(jīng)存在于文件中.WARNING:變量“date已經(jīng)存在于文件中.WARNING:變量“orig已經(jīng)存在于文件中.WARNING:變量“des已經(jīng)存在于文件中.WARNING:別名=B由于 INOBS=選項(xiàng).WARNING:別名=A由于 INOBS=選項(xiàng).NOTE:表創(chuàng)

46、立完成,有7行,11歹限選項(xiàng) 這個選項(xiàng)的功能與inobs相似,不同的是,這個選項(xiàng)指定結(jié)果的觀測值數(shù)量,而不是讀取源表的數(shù)量,這在我們限制輸出結(jié) 果的數(shù)據(jù)量時(shí)非常有用.243procsqloutobs=10;244createtabletmp1as245selecta.*,b.*246fromMarcha,Delayb247=變量"flight已經(jīng)存在于文件中.WARNING:變量“date已經(jīng)存在于文件中.WARNING:變量“orig已經(jīng)存在于文件中.WARNING:變量“des已經(jīng)存在于文件中.WARNING:語句由于OUTOBS=10選項(xiàng)而過早終止.NOTE:表創(chuàng)立完成,有10

47、行,11列.選項(xiàng)這里prompt選項(xiàng),可以讓你選擇是否還是根據(jù)原來的設(shè)置進(jìn)行動作,或者繼續(xù)操作.如下面的日志所以,如果直接選擇停 止,那么得到的結(jié)果,如果一直按繼續(xù),那么得到如下結(jié)果:255procsqlinobs=10prompt;256createtabletmp3as257selecta.*,b.*258fromMarcha,Delayb259=變量"flight已經(jīng)存在于文件中.WARNING:變量“date已經(jīng)存在于文件中WARNING:變量“orig已經(jīng)存在于文件中WARNING:變量“des已經(jīng)存在于文件中.NOTE:表創(chuàng)立完成,有19行,11列.選項(xiàng)procsql o

48、utobs=4number;select*fromMarch;quit;選項(xiàng)對上述SQL語句加上reset選項(xiàng),使其不輸出序號procsql outobs=4number;resetnonumber;select*fromMarch;quit ;2DICTIONARY介紹DICTIONARY可以得到很多SAS文件和會話等很多的元數(shù)據(jù),包括 SAS文件,外部文件,系統(tǒng)選項(xiàng)、宏、標(biāo)題、腳注等.DICTIONARY是在初始化時(shí)就創(chuàng)立,自動更新,并只允許讀取操作,故不能修改.下面列舉一下SAS中DICTIONARY所包含的表:SASV8DICTIONARY 所包含的表:CATALOGS : SAS目錄

49、的信息COLUMNS : SAS變量和列的信息EXTFILES :外部數(shù)據(jù)信息INDEXES :參與索引的列的信息MACROS :宏相關(guān)信息MEMBERS :所有數(shù)據(jù)類型表、視圖、目錄等的信息OPTIONS:當(dāng)前會話選項(xiàng)STYLES : ODS的樣式信息TABLES :表和數(shù)據(jù)集信息TITLES :標(biāo)題和腳注信息VIEWS :視圖信息SASV9DICTIONARY所包含的新的表:CHECK_CONSTRAINTS : CHECK 約束信息CONSTRAINT_COLUMN_USAGE :約束歹U使用信息CONSTRAINT_TABLE_USAGE :約束表使用DICTIONARIES : DI

50、CTIONARY 所有表及其列ENGINES :可用的弓I擎FORMATS :可用的格式GOPTIONS : SAS/GRAPH 選項(xiàng)LIBNAMES : LIBNAME 信息REFERENTIAL_CONSTRAINTS :相關(guān)約束REMEMBER :已記錄的信息TABLE CONSTRAINTS :表約束查看中各表內(nèi)容查看各表的結(jié)構(gòu),以查看為例:procsql;quit;這里可以從日志里看到表的結(jié)構(gòu).要查看這個表的數(shù)據(jù),可以通過以下語句實(shí)現(xiàn),這里我們只輸出前10條數(shù)據(jù)procsql outobs=10;select*;quit ;使用DICTIONARY 的信息查看SASHELP庫里的文件

51、信息:procsql ;optionsnolabelnocenter;selectmemname,nobs,nvar,crdatewherelibname='SASHELP'quit ;注意,這里的庫名都是大寫.查看SASHELP庫里有列名為tabname的所有表:procsql;optionsnolabelnocenter;selectmemnamewherelibname='SASHELP'andname='tabname'quit;注意這里是用的信息用來撮的信息:proctabulate data=8.;classlibnamememtyp

52、e;keylabelN="tablelibname,memtype/rts=10misstext='None'run ;DICTIONARY是一個非常有用的信息庫,本文主要是介紹一下其根本功能,以后有時(shí)間的話會對其進(jìn)行詳細(xì)介紹.3SQL過程步與宏語言的交互SQL過程步可以創(chuàng)立SAS宏變量,也可以生成一些自動的宏變量,從其中可以更好地理解SQL處理過程.在SQL過程中使用宏變量%letoutputnumber=10;procsql outobs=&outputnumber;optionsnolabelnocenter;select*wherelibname=&q

53、uot;SASHELP'quit;這個很簡單,就不講了,下面講一下本節(jié)的重點(diǎn).創(chuàng)立宏變量SQL過程步可以通過into語句來創(chuàng)立或更新宏變量,主要有三種方式.這里要注意的是,在使用into語句創(chuàng)立宏變量時(shí),我們是不能在createtable或createview語句里使用的.當(dāng)我們不需要輸出結(jié)果時(shí),可以用 noprint選項(xiàng).結(jié)果只有一行Selectcol1,col2, Into:mvar1,:mvar2, From 例:procsql noprint;selectavg(sales),min(sales),max(sales)into:mean,:min,:max;quit ;%put

54、&mean&min&max;這種方式適合輸出結(jié)果只有一行的情況.提取前N行的值Selecta,b, Into:a1-:an,:b1-:bnFrom 這種方法前前N行的查詢結(jié)果輸入到一系列的N個宏變量中例:procsql noprint;selectRegion,count(*)asfrequencyinto:Region1-:Region3,:freq1-:freq3groupbyRegion;quit;%put&Region1&Region2&Region3;%put&freq1&freq2&freq3;提取所有數(shù)據(jù)Se

55、lectcol1,col2, Into:macrovar1,:macrovar2, Separatedby ' delimiter 'From 這里將每列的所有數(shù)據(jù)都輸出到一個宏變量中,并以指定的分隔符分開.例:procsql noprint;selectdistinctRegioninto:RegionAllseparatedby',';quit;%put&RegionAll;過程步自動產(chǎn)生的宏變量SQLOBS:記錄輸出結(jié)果或被刪除的觀測值個數(shù)SQLRC:包含每個SQL語句的返回代碼SQLOOPS:包含SQL過程步內(nèi)循環(huán)的次數(shù)例:procsql ;se

56、lect*;quit ;%put&SQLOBS;得到輸出觀測的條數(shù).4程序測試與效率這里主要介紹幾個SQL過程步的選項(xiàng):Exec/Noexec:限制SQL語句是否執(zhí)行Nostimer/Stimer :在SAS日志中報(bào)告每個SQL語句的效率統(tǒng)計(jì)數(shù)據(jù)Noerrorstop/Errorstop:批處理時(shí)限制當(dāng)有錯誤發(fā)生時(shí),是否要檢查語法例:noexe與 feedback66procsqlfeedbacknoexec;67select*;NOTE:Statementtransformsto:,;NOTE:由于NOEXEC選項(xiàng),未執(zhí)行語句.68quit;NOTE: "PROCEDURESQL所用時(shí)間總處理時(shí)間實(shí)際時(shí)間秒CPU時(shí)間秒這里我們要注意的是,在比擬不同SQL語句的效率時(shí),一定要用 CPU時(shí)間,而不是用實(shí)際時(shí)間,由于實(shí)際時(shí)間可能會因運(yùn)行機(jī)器的環(huán)境而有很大的出入.還要注意的是,對于同一個數(shù)據(jù)集,在比擬效率時(shí),一定要考慮到該數(shù)據(jù)集第一次運(yùn)行后其 排序等已經(jīng)發(fā)生變化,會對效率也有影響.在SQL過程步中使用SAS數(shù)據(jù)步的選項(xiàng)在SQL過程步中使用SAS數(shù)據(jù)步的選項(xiàng)UsingDataSet

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論