SAS中的SQL語句大全_第1頁
SAS中的SQL語句大全_第2頁
SAS中的SQL語句大全_第3頁
SAS中的SQL語句大全_第4頁
SAS中的SQL語句大全_第5頁
已閱讀5頁,還剩38頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上SAS中的SQL語句完全教程之一:SQL簡介與基本查詢功能 本系列全部內容主要以SQL Processing with the SAS System (Course Notes)為主進行講解,本書是在網上下載下來的,但忘了是在哪個網上下的,故不能提供下載鏈接了,需要的話可以發郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅用于學習,不得用于商業目的,否則后果自負。  1 SQL過程步介紹1.1 SQL過程步可以實現下列功能:查詢SAS數據集、從SAS數據集中生成報表、以不同方式實現數據集合并、創建或刪除SAS數據集、視圖、索引等、更新

2、已存在的數據集、使得SAS系統可以使用SQL語句、可以和SAS的數據步進行替換使用。注意,SQL過程步并不是用來代替SAS數據步,也不是一個客戶化的報表工具,而是數據處理用到的查詢工具。 1.2 SQL過程步的特征SQL過程步并不需要對每一個查詢進行重復、每條語句都是單獨處理、不需要print過程步就能打印出查詢結果、也不用sort過程步進行排序、不需要run、要quit來結束SQL過程步 1.3 SQL過程步語句SELECT:查詢數據表中的數據ALTER:增加、刪除或修改數據表的列CREATE:創建一個數據表DELETE:刪除數據表中的列DESCRIBE:列出數據表的屬性

3、DROP:刪除數據表、視圖或索引INSERT:對數據表插入數據RESET:沒用過,不知道什么意思SELECT:選擇列進行打印UPDATE:對已存在的數據集的列的值進行修改   2 SQL基本查詢功能 2.1 SELECT語句基本語法介紹SELECT <DISTINCT> object-item <, .object-item> FROM from-list  <WHERE sql-expression>  <GROUP BY group-by-item <, . gr

4、oup-by-item>>  <HAVING sql-expression>  <ORDER BY order-by-item <, . order-by-item>> 這里SELECT:指定被選擇的列FROM:指定被查詢的表名WHERE:子數據集的條件GROUP BY:將數據集通過group進行分類HAVING:根據GROUP BY的變量得到數據子集ORDER BY:對數據集進行排序 2.2 SELECT語句的特征選擇滿足條件的數據、數據分組、對數據進行排序、對數據指定格式、一次最多查

5、詢32個表。這里還要提到的就是,在SAS系統中,對于表名和變量名一般不超過32個字符,對于庫名,文件引用名,格式等不能超過8個字符 2.3 Validate關鍵字Validate關鍵字只存在于select語句中、可以在不運行查詢的情況下測試語句的語法、檢查列名是否合法、對于不正確的查詢將打印其消息。例:1    proc sql;2        validate3        select Region, Pro

6、duct,Sales4        from sashelp.shoes5        where Region = 'Africa'NOTE: PROC SQL 語句有有效語法。6    quit;此外,我們還可以用noexec選項也可以用來進行語法測試。例:7    proc sql noexec;8      &

7、#160; select Region, Product,Sales9        from sashelp.shoes10       where Region = 'Africa'NOTE: 由于 NOEXEC 選項,未執行語句。11   quit;這里提示未執行,未提示錯誤,說明該語句沒有語法錯誤。但是如果加入一個sashelp.shoes表里沒有字段,這里就會出現錯誤,例:12   proc sql

8、noexec;13       select Region, Product,Sales,test14       from sashelp.shoes15       where Region = 'Africa'ERROR: 以下這些列在起作用的表中沒有找到: test.16   quit; 2.4 查詢列我們可以像2.3那樣查詢指定列,也可以用*來查詢所有列。例:p

9、roc sql;       select *       from sashelp.shoes;quit;這里我們可以用feedback選項來查看到底我們選擇了哪些列:17   proc sql feedback;18       select *19       from sashelp.shoes;NOTE: Statement t

10、ransforms to:        select SHOES.Region, SHOES.Product, SHOES.Subsidiary, SHOES.Stores, SHOES.Sales, SHOES.Inventory, SHOES.Returns          from SASHELP.SHOES;20   quit;這時,我們可以看到從sashelp.shoes表中選擇了8個列 2.

11、5 消除重復值我們可以用distinct選項來消除重復值。例如,我們要得到沒有重復的所有地區的名稱:proc sql;    select distinct Region    from sashelp.shoesquit; 2.6 where子集查詢2.6.1 比較運算符先列出where語句用到的比較運算符:LT   <    小于GT   >    大于EQ   =  &

12、#160; 等于LE   <=   小于或等于GE   >=   大于或等于NE   =   不等于例如,我們要查詢sales大于的所有數據:proc sql;    select *    from sashelp.shoes    where sales>quit; 2.6.2 in:只要滿足in里的任意一個值,表達式即為真,例如,我們要選擇Region在

13、Africa和Eastern Europe的所有數據:proc sql;    select *    from sashelp.shoes    where Region in ('Africa','Eastern Europe');quit; 2.6.3 邏輯運算符OR     |      或AND   &   

14、  是NOT         非例如,選擇Region在Africa和Eastern Europe,且銷售額大于的所有數據:proc sql;    select *    from sashelp.shoes    where Region in ('Africa','Eastern Europe') and  sales>quit; 2.6.4 CONTAINS或?

15、:判斷某列是否包含指定字符串例如,選擇列Region包含Afr的數據:proc sql;    select *    from sashelp.shoes    where Region ? 'Afr'quit; 2.6.5 IS NULL或IS MISSING:判斷某列數據是否為空例如,如果找出Region為空的數據:proc sql;    select *    from sashelp.shoes &

16、#160;  where Region is missing;quit;注意,這里我們還可以用以下表達式對where語句進行替換。如果region為數值型變量,則可以用region=.,如果region為字符型變量,則可以用region= 進行替換。 2.6.6 Between and:選擇某一區間的數據例如選擇sales大于,但小于的所有數據:proc sql;    select *    from sashelp.shoes    where sales between and

17、;quit; 2.6.7 like:判斷是否能匹配某些字符例如,選擇以region以A開頭的所有地區proc sql;    select *    from sashelp.shoes    where Region like 'A%'quit;這里注意有兩類通配符,%可以通配任意個任意字符,_只能通配一個任意字符 2.6.8 =*:類似匹配這里由于sashelp.shoes里沒有符合要求的數據,所有就用書上的例子說明一下吧:Where lastname=* smit

18、h,出來的結果可能是:smith,smythe等 2.7 表達式我們可以通過已有的列進行計算來得到新的列,這時用關鍵詞as來給新的列賦列名,例如:proc sql;    select Region, Product,Sales,Stores,Sales/Stores as salesperstores    from sashelp.shoesquit;這時結果就會多一列salesperstores,用來得到該地區該產品每個商店的平均銷售量。這里要注意的是,在創建表達式時,我們還可以在SQL里用到SAS中的除LAG和DIF

19、F之外的所有函數。 這里我們還可以用表達式計算出來的結果來進行子集查詢,但一定要記住用calculated關鍵詞。例如我們要找出商店平均銷售量大于5000的數據:方法一:proc sql;    select Region, Product,Sales,Stores,Sales/Stores as salesperstores    from sashelp.shoes    where Sales/Stores>5000;quit;方法二:proc sql;  

20、60; select Region, Product,Sales,Stores,Sales/Stores as salesperstores    from sashelp.shoes    where calculated salesperstores>5000;quit; 2.8 查詢結果展示2.8.1 order by數據排序默認的排序方式是升序,我們可以用DESC關鍵詞來進行降序排列。例如以sales降序排列數據:proc sql;    select *  &

21、#160; from sashelp.shoes    order by Sales DESC;quit;這里提示一下,我們可以用任意多列進行排序,包括表達式結果(不用calculated),但最好是選擇的列。 2.8.2 LABEL與FORMATLABEL:改變輸出變量名的內容FORMAT:改變列的值的輸出方式例如,改變salesperstores的label和formatproc sql;    select Region, Product,Sales,Stores,    Sales/St

22、ores as salesperstores    label='sales per stores'    format=dollar12.2    from sashelp.shoes;quit; 2.9 處理SQL常用函數MEAN或AVG:均值COUNT或N或FREQ:非缺失值個數MAX:最大值MIN:最小值NMISS:缺失值個數STD:標準差SUM:求和VAR:方差 2.9.1 求和sumproc sql;    select Reg

23、ion, Product,Sales,Stores,    sum(Sales,Inventory,Returns) as total    from sashelp.shoes;quit; 2.9.2 求均值avgproc sql;    select Region, Product,Sales,Stores,    avg(Sales) as salesavg    from sashelp.shoes;quit; 2.9

24、.3 分組求均值group byproc sql;    select Region,    avg(Sales) as salesavg    from sashelp.shoes    group by Region;quit; 2.9.4 計數countproc sql;    select Region,count(*) as count    from sashelp.shoes 

25、60;  group by Region;quit; 2.9.5 HAVING數據子集proc sql;    select Region,count(*) as count    from sashelp.shoes    group by Region    having count(*)>50;quit;其它的就不多作介紹了,多用用就熟悉了 2.10子查詢2.10.1 找出regions平均sales大于全部平均sales的regio

26、nproc sql;    select Region,    avg(Sales) as salesavg    from sashelp.shoes    group by Region    having avg(Sales)>    (select avg(Sales) from sashelp.shoes);quit; 2.10.2 ANY關鍵詞介紹>ANY(20,30,40)

27、0;  最終效果:>20<ANY(20,30,40)   最終效果:<40=ANY(20,30,40)   最終效果:=20 or =30 or =40例如,選擇出region為united state的sales小于任意region為africa的sales的數據proc sql;    select Region,Sales    from sashelp.shoes    where Region='United State

28、s'    and Sales<any    (select Sales from sashelp.shoes where Region='Africa');quit;這個例子沒有多少意義,只是說明一下any的用法 2.10.3 ALL關鍵詞介紹>ALL (20,30,40)   最終效果:>40<ALL (20,30,40)   最終效果:<20例如,選擇出region為united state的sales小于所有region為a

29、frica的sales的數據proc sql;    select Region,Sales    from sashelp.shoes    where Region='United States'    and Sales<all    (select Sales from sashelp.shoes where Region='Africa');quit; 2.10.4 EXISTS與NOT

30、EXISTSproc sql;    select *    from sashelp.shoes    where   exists    (select * from sashelp.orsales);quit;SAS中的SQL語句完全教程之二:數據合并與建表、建視圖SAS中的SQL語句完全教程之二:數據合并與建表、建視圖索引等 本系列全部內容主要以SQL Processing with the SAS System (Course Note

31、s)為主進行講解,本書是在網上下載下來的,但忘了是在哪個網上下的,故不能提供下載鏈接了,需要的話可以發郵件向我索取,我定期郵給大家,最后聲明一下所有資料僅用于學習,不得用于商業目的,否則后果自負。  1 連接joins分為內連接inner joins和外連接outer joins內連接:僅返回匹配的數據,最多可以有32個表同時進行內連接外連接:返回所有匹配的數據和非匹配的數據,一次只能有兩個表或視圖進行外連接迪卡爾積:返回表內所有可能的匹配情況。例如表A有10*20的數據,表B有30*40的數據,則兩個表的迪卡爾積有(10+30)*(20+40)=40*60的數據 

32、;我們先建立兩個數據集: data march;   input flight $3. +5 date date7. +3 depart time5. +2 orig $3.         +3 dest $3.  +7 miles +6 boarded +6 capacity;   format date date7. depart time5.;   informat date date7. depart time5.; 

33、;  cards;219     01MAR94    9:31  LGA   LON       3442       198       250622     01MAR94   12:19  LGA   FRA&#

34、160;      3857       207       250132     01MAR94   15:35  LGA   YYZ        366       115  

35、0;    178271     01MAR94   13:17  LGA   PAR       3635       138       250302     01MAR94   20:22  LGA  

36、WAS        229       105       180114     02MAR94    7:10  LGA   LAX       2475       119 

37、      210202     02MAR94   10:43  LGA   ORD        740       120       210219     02MAR94    9:31

38、60; LGA   LON       3442       147       250132     02MAR94   15:35  LGA   YYZ        366     &

39、#160; 106       178202     03MAR94   10:43  LGA   ORD        740       118       210219     03MAR94  

40、;  9:31  LGA   LON       3442       197       250622     03MAR94   12:19  LGA   FRA       3857   

41、60;   180       250271     03MAR94   13:17  LGA   PAR       3635       147       250202     04MAR94 

42、  10:43  LGA   ORD        740       148       210219     04MAR94    9:31  LGA   LON       3442  

43、;     232       250622     04MAR94   12:19  LGA   FRA       3857       137       250132     04M

44、AR94   15:35  LGA   YYZ        366       117       178271     04MAR94   13:17  LGA   PAR       3635 

45、      146       250302     04MAR94   20:22  LGA   WAS        229       115       180114   

46、  05MAR94    7:10  LGA   LAX       2475       117       210202     05MAR94   10:43  LGA   ORD      &

47、#160; 740       104       210219     05MAR94    9:31  LGA   LON       3442       160       250622

48、60;    05MAR94   12:19  LGA   FRA       3857       185       250132     05MAR94   15:35  LGA   YYZ    

49、60;   366       157       178271     05MAR94   13:17  LGA   PAR       3635       177       2501

50、14     06MAR94    7:10  LGA   LAX       2475       128       210202     06MAR94   10:43  LGA   ORD   

51、;     740       115       210219     06MAR94    9:31  LGA   LON       3442       163    &#

52、160;  250132     06MAR94   15:35  LGA   YYZ        366       150       178302     06MAR94   20:22  LGA   WAS&#

53、160;       229        66       180114     07MAR94    7:10  LGA   LAX       2475       160 

54、      210132     07MAR94   15:35  LGA   YYZ        366       164       178271     07MAR94   13:17  L

55、GA   PAR       3635       155       250302     07MAR94   20:22  LGA   WAS        229      

56、 135       180;run; data delay;   input flight $3. +5 date date7. +2 orig $3. +3 dest $3. +3         delaycat $15. +2 destype $15. +8 delay;   informat date date7.;   format date date7.; 

57、60; cards;114     01MAR94  LGA   LAX   1-10 Minutes     Domestic                8202     01MAR94  LGA   ORD   No De

58、lay         Domestic               -5622     01MAR94  LGA   FRA   No Delay         International 

59、60;        -5132     01MAR94  LGA   YYZ   11+ Minutes      International          14302     01MAR94  LGA   WAS 

60、;  No Delay         Domestic               -2114     02MAR94  LGA   LAX   No Delay         Domestic&

61、#160;               0202     02MAR94  LGA   ORD   1-10 Minutes     Domestic               

62、 5219     02MAR94  LGA   LON   11+ Minutes      International          18622     02MAR94  LGA   FRA   No Delay     

63、    International           0132     02MAR94  LGA   YYZ   1-10 Minutes     International           5271   

64、;  02MAR94  LGA   PAR   1-10 Minutes     International           4302     02MAR94  LGA   WAS   No Delay         Dom

65、estic                0114     03MAR94  LGA   LAX   No Delay         Domestic          

66、0;    -1202     03MAR94  LGA   ORD   No Delay         Domestic               -1219     03MAR94  LGA 

67、  LON   1-10 Minutes     International           4622     03MAR94  LGA   FRA   No Delay         International   

68、60;      -2132     03MAR94  LGA   YYZ   1-10 Minutes     International           6271     03MAR94  LGA   PAR   1-10

69、 Minutes     International           2302     03MAR94  LGA   WAS   1-10 Minutes     Domestic            &

70、#160;   5114     05MAR94  LGA   LAX   No Delay         Domestic               -2202     06MAR94  LGA 

71、0; ORD   No Delay         Domestic               -3219     06MAR94  LGA   LON   11+ Minutes      International

72、          27132     06MAR94  LGA   YYZ   1-10 Minutes     International           7302     06MAR94  LGA  

73、 WAS   1-10 Minutes     Domestic                1622     07MAR94  LGA   FRA   11+ Minutes      International   

74、;       21132     07MAR94  LGA   YYZ   No Delay         International          -2271     07MAR94  LGA   P

75、AR   1-10 Minutes     International           4302     07MAR94  LGA   WAS   No Delay         Domestic     

76、0;          0;run; 1.1 內連接proc sql;    create table innerjoins as    select a.*,b.*    from March a,Delay b    where a.flight=b.flight and a.date=b.date;quit; 1.2 外連接1.2.1 左連接left joinp

77、roc sql;    create table leftjoins as    select *    from March a    left join Delay b    on a.flight=b.flight and a.date=b.date;quit; 1.2.2 右連接right joinproc sql;    create table rightjoins as  

78、  select *    from March a    right join Delay b    on a.flight=b.flight and a.date=b.date;quit; 1.2.3 全連接full joinproc sql;    create table fulljoins as    select *    from March a   

79、full join Delay b    on a.flight=b.flight and a.date=b.date;quit; 1.3 迪卡爾積proc sql;    create table cartesian as    select a.*,b.*    from March a,Delay b;quit; 這里再大概說明一下內外連接的實現的基本原理:首先生成兩個數據表的迪卡爾積,然后再根據where語句來選擇符合條件的數據作為輸出結果。當然,

80、在實際處理過程中,SQL過程步會對這個迪卡爾積的數據集進行優化,將其劃分成小塊數據進行處理。 2 復雜的連接這里因為找不到很好的例子來說明如何處理復雜的連接,因此就不講解了,大概說一下思路吧:簡單地說,對于復雜的查詢,我們應該將該查詢分解成幾個小的子查詢,然后對每個子查詢的結果進行測試,最后將所有的子查詢結合起來就組成了這個復雜的查詢。這樣會比一來就寫復雜的查詢容易得多。 3 數據集SET操作這里有四類SET操作,分別是EXCEPT、INTERSECT、UNION、OUTER UNION。EXCEPT:得到除第二個數據集以外的所有第一個數據集里的數據INTERSECT:得到

81、第一個數據集和第二個數據集都有的數據UNION:得到兩個數據集所有的數據,這里如果兩個數據集有相同的數據,重復數據只出現一次OUTER UNION:得到兩個數據集所有的數據。 還有兩個關鍵詞來修改SET操作的行為:ALL和CORRESPONDINGALL:并不刪除重復值,不能與OUTER UNION合用(注意,用ALL關鍵詞,一種情況是你不管是否會有重復值,另一個情況是不可能出現重復值,例如有主鍵的數據)CORRESPONDING:只保留兩個數據集都有的字段,一般簡寫為CORR  3.1 EXCEPT找出所有沒有延遲的航班和日期:proc sql; &#

82、160;  select flight,date       from March    except    select flight,date       from Delay;quit;注意:這里重復值已經被刪除。如果要得到所有的包含重復值的數據,就要用到關鍵詞ALL:proc sql;    select flight,date   

83、60;   from March    except ALL    select flight,date       from Delay;quit;如果只保留兩個數據集都有的字段,則用到關鍵詞CORRESPONDING(可簡寫為CORR):proc sql;    select *       from March    except

84、CORR    select *       from Delay;quit; 3.2 INTERSECT找出所有延遲的航班和日期:proc sql;    select flight,date       from March    INTERSECT     select flight,date   &#

85、160;   from Delay;quit;關鍵詞ALL和CORRESPONDING與在EXCEPT中一樣,這里不再作介紹 3.3 UNION選擇所有的數據,這里的重復值只出現一次proc sql;    select flight,date       from March    UNION     select flight,date     

86、0; from Delay;quit;關鍵詞ALL和CORRESPONDING與在EXCEPT中一樣,這里不再作介紹 3.4 OUTER UNIONproc sql;    select flight,date       from March    OUTER UNION     select flight,date       from Delay;quit;這里

87、,如果我們用到關鍵詞CORR,就可以將相同字段的數據結合到一起:proc sql;    select *       from March    OUTER UNION  CORR    select *       from Delay;quit; 4 建表4.1 建空表4.1.1 通過指定變量建空表proc sql noprint;   cr

88、eate table percent       (varname char(30),       Industry char(4),       begindate num format date9.  label='the beginning date',       enddate num format date9. labe

89、l='the ending date',       P_1 num,       P_5 num,       P_95 num,       P_99 num);quit; 4.1.2 拷貝數據集來建空表proc sql noprint;   create table Delaycopy(keep=fligh

90、t date)   like Delay;quit; 4.1.3 查詢語句中,用outobs選項來建空表proc sql noprint outobs=0;   create table flight114 as   select *   from Delay;quit; 4.2 對數據表增加數據主要有三種方法:4.2.1 SET語句proc sql noprint;insert into flight114set flight='302' ,   

91、 date='07MAR94'd,    orig='LGA',    dest='WAS',    delaycat='No Delay',    destype='Domestic',     delay=0;quit; 4.2.2 VALUES語句proc sql noprint;insert into flight114values(

92、9;271','07MAR94'd,'LGA','PAR','1-10 Minutes','International',4);quit; 4.2.3 條件查詢 :建表和導入數據同時完成proc sql noprint;   create table flight114 as   select *   from Delay   where flight='114'quit; 5 完整

93、性約束完整性約束的好處是保證SAS數據集的連續性和正確性,它在我們更新數據或插入新的數據時,驗證新的數據是否符合該變量的約束條件。完整性約束需要8.0以上版本,符合ANSI標準,可以在表建立時或表有數據后建立約束,但不能被用于視圖,也不能用于低于8.0版本的SAS系統建立的數據集。五大類完整性限制:NOT NULL、CHECK、UNIQUE、PRIMARY KEY、FOREIGN KEY。NOT NULL:不許出現缺失值CHECK:指定該變量可以輸入哪些值UNIQUE:每個值必須是唯一的,其值可以為空,但只能有一個值為空PRIMARY KEY:主鍵,每個值必須是唯一且非空的FOREIGN KE

94、Y:其它表的主鍵,即外鍵,其值為關聯表的主鍵的值且非空 5.1 check例:proc sql noprint;   create table percent       (varname char(30),       Industry char(4),       begindate num format date9.  label='the beginning d

95、ate',       enddate num format date9. label='the ending date',       percent num,CONSTRAINT percent _check check(percent le 1.0);quit;這時,如果我們插入的數據中,percent>1的話,將會出現錯誤。 5.2 回滾ROLLBACKS當我們用INSERT或UPDATE的時候,操作要等到發生錯誤的時候才會停止

96、,這時會出現一個問題,就是數據表的一些數據更新了,而另一些數據沒更新,這時如果我們要回到原來的狀態,就需要用到UNDO_POLICY選項進行回滾。UNDO_POLICY有三個選項:REQUIRED:缺省選項,取消所有的更新或新插入的數據。這里要注意的是,此操作不一定完全能成功。NONE:阻止所有的與約束不符的更新或新數據OPTOINAL:取消所有可以成功取消的更新或新插入的數據 本功能用得很少,所以只是翻譯一下,請大家查閱相關文獻。 6 創建視圖與索引6.1 視圖視圖最大的好處是它只是一個存儲的查詢,因此不包含任何數據,這可以減少磁盤的使用空間。其它的功能與數據庫的表類似。創建視圖語法:Create View View-name as Query-expression 例:proc sql noprint outobs=0;   create View  delayview as   select *   from Delay;quit; 6.2 索引語法:Create <unique> Index index-nameOn table-name (column-name,column-name); 視圖和索引都用得很少,所以這里就不作講

溫馨提示

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

評論

0/150

提交評論