




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司禮儀提升活動方案
- 公司端午節文體活動方案
- 公司文匯活動方案
- 公司留深過年活動方案
- 公司活動設計策劃方案
- 公司組織公益活動方案
- 公司組織建設活動方案
- 公司百人活動策劃方案
- 公司搞運動會活動方案
- 公司福利娛樂活動方案
- QC小組活動成果-提高地下室綜合管線施工質量工程技術
- 電機控制與調速技術 教案
- 【MOOC】生理學-中南大學 中國大學慕課MOOC答案
- 【湘藝版必修《音樂鑒賞》第四單元《中國民族民間音樂》單元教學設計】
- 【MOOC】鐵路行車組織-北京交通大學 中國大學慕課MOOC答案
- 服務質量保障
- 通信施工安全生產培訓
- 學習2024年《關于加強社會組織規范化建設推動社會組織高質量發展的意見》解讀課件
- 2024年秋季新人教PEP版三年級上冊英語全冊教案
- 解除勞動合同登記表
- 2024年浙江省中考數學試題及答案
評論
0/150
提交評論