手把手教你醫(yī)學(xué)統(tǒng)計(jì)-SAS 編程技巧 - PROC SQL(一)
SQL 全稱 Strucured Query Language,即結(jié)構(gòu)化查詢語(yǔ)言,廣泛應(yīng)用于關(guān)系型數(shù)據(jù)庫(kù)中。
SAS Base 使用 PROC SQL 提供了對(duì) SQL 的實(shí)現(xiàn)。PROC SQL 過(guò)程可以幫助我們完成以下任務(wù):
創(chuàng)建數(shù)據(jù)集、視圖和索引
刪除數(shù)據(jù)集、視圖和索引
修改數(shù)據(jù)集的結(jié)構(gòu)
修改數(shù)據(jù)集的觀測(cè)
從數(shù)據(jù)集或視圖中獲取觀測(cè)
從數(shù)據(jù)集或視圖中合并觀測(cè)
匯總統(tǒng)計(jì)
上述任務(wù)可以用四個(gè)字簡(jiǎn)要概括:增、刪、改、查。
在這一節(jié)中,我們主要介紹如何使用 SQL 創(chuàng)建和刪除數(shù)據(jù)集、視圖和索引、修改數(shù)據(jù)集的結(jié)構(gòu),以及更新、新增和刪除數(shù)據(jù)集中的觀測(cè)。
創(chuàng)建數(shù)據(jù)集
使用?CREATE TABLE?語(yǔ)句可以創(chuàng)建一個(gè)數(shù)據(jù)集。例如:下述代碼創(chuàng)建了一個(gè)包含若干變量的數(shù)據(jù)集,并定義了變量標(biāo)簽、輸入格式、輸出格式:
↑向右滑動(dòng)查看全部代碼↑
該數(shù)據(jù)集名稱為 DM ,包含 3 個(gè)字符型變量和 3 個(gè)數(shù)值型變量。變量的定義包括變量名和變量類型,變量名可以是任何合法的 SAS 名稱,變量類型可以是?CHARACTER?和?NUMERIC?,可以分別簡(jiǎn)寫為?CHAR?和?NUM?。
運(yùn)行后查看數(shù)據(jù)集 DM 屬性:

CREATE TABLE?語(yǔ)句還支持基于現(xiàn)有數(shù)據(jù)集結(jié)構(gòu)創(chuàng)建空白數(shù)據(jù)集,只需使用?LIKE?關(guān)鍵字即可:
上述代碼將會(huì)創(chuàng)建一個(gè)名為 DM1 的數(shù)據(jù)集,其結(jié)構(gòu)與數(shù)據(jù)集 DM 完全一致,但不含任何觀測(cè)。
創(chuàng)建視圖
視圖本質(zhì)上是一段 PROC SQL 的查詢語(yǔ)句,本身并不包含任何數(shù)據(jù)集中的任何數(shù)據(jù),當(dāng)在 SAS 過(guò)程或 DATA 步中使用視圖時(shí),視圖包含的查詢語(yǔ)句將會(huì)自動(dòng)執(zhí)行。這意味著每次訪問(wèn)視圖時(shí),查詢到的數(shù)據(jù)都有可能是不同的,即視圖是動(dòng)態(tài)更新的。
當(dāng)某個(gè)查詢語(yǔ)句被頻繁使用時(shí),可以為其創(chuàng)建視圖,以供其他查詢語(yǔ)句訪問(wèn),而無(wú)需每次訪問(wèn)時(shí)編寫重復(fù)的查詢語(yǔ)句。
使用?CREATE VIEW?可以創(chuàng)建一個(gè)視圖。例如:下述代碼創(chuàng)建了一個(gè)視圖,該視圖查詢了數(shù)據(jù)集 DM 中年齡 ≥ 60 歲的受試者信息。
注:上述代碼使用了?SELECT?語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,我們將在未來(lái)的章節(jié)中介紹它。
創(chuàng)建索引
索引是一種數(shù)據(jù)結(jié)構(gòu),可以將其看做書的目錄,它存儲(chǔ)了指向特定觀測(cè)的指針,以便可以通過(guò)指針快速定位特定數(shù)據(jù)。使用索引可以提高 PROC SQL 在特定情況下執(zhí)行查詢語(yǔ)句的效率。
索引又分為簡(jiǎn)單索引(simple index)和復(fù)合索引(composite index)。
簡(jiǎn)單索引:在一個(gè)變量上創(chuàng)建,索引名稱必須與變量名相同;
復(fù)合索引: 在兩個(gè)或多個(gè)變量上創(chuàng)建,索引名稱不能與數(shù)據(jù)集中的任何變量名相同。
使用?CREATE INDEX?可以創(chuàng)建一個(gè)索引。例如:下述代碼為數(shù)據(jù)集 DM 中的受試者唯一編號(hào)建立了索引。
復(fù)合索引適用于無(wú)法使用單一變量標(biāo)識(shí)唯一觀測(cè)的數(shù)據(jù)集(ADLB,ADAE等),例如:
在數(shù)據(jù)集屬性信息的“索引”標(biāo)簽中可以查看已定義的索引信息:

刪除數(shù)據(jù)集、視圖、索引
使用?DROP?語(yǔ)句可以刪除數(shù)據(jù)集、視圖和索引。
刪除操作需要注意以下問(wèn)題:
1. 刪除數(shù)據(jù)集或視圖后,所有引用了該數(shù)據(jù)集或視圖的視圖都將失效;
2. 刪除含有索引的數(shù)據(jù)集后,該數(shù)據(jù)集中的所有索引也將一并被刪除;
3. 刪除一個(gè)復(fù)合索引后,其所關(guān)聯(lián)的變量都將失去該復(fù)合索引,但會(huì)保留其他索引。
修改數(shù)據(jù)集的結(jié)構(gòu)
使用?ALTER TABLE?可以修改數(shù)據(jù)集的結(jié)構(gòu),包括增加、刪除變量、修改變量屬性,以及對(duì)數(shù)據(jù)完整性約束(integrity constraints)的操作。
數(shù)據(jù)完整性約束涉及到較高級(jí)的概念,我們將在未來(lái)的章節(jié)中介紹它,這一節(jié)我們只介紹對(duì)變量的增加、刪除和修改操作。
新增變量
使用?ADD?子句可以新增一個(gè)或多個(gè)變量,我們可以在新增變量的同時(shí)指定變量的屬性。
↑向右滑動(dòng)查看全部代碼↑

刪除變量
使用?DROP?子句可以刪除變量。
注意:刪除某個(gè)變量時(shí),使用該變量定義的索引(包括簡(jiǎn)單索引和復(fù)合索引)都將一并被刪除。
修改變量屬性
使用?MODIFY?子句可以修改變量的屬性,用法與?ADD?子句類似。
↑向右滑動(dòng)查看全部代碼↑
上述代碼修改了數(shù)據(jù)集 DM 中變量 RANDDT 和 SEX 的屬性,分別將它們的輸出格式修改為?e8601da10.?和?$sex.?,同時(shí)將變量 SEX 的長(zhǎng)度修改為 10。
注意:ALTER TABLE 語(yǔ)句無(wú)法修改變量名,如需修改這些屬性,請(qǐng)使用 CREATE TABLE 或 SELECT 語(yǔ)句間接完成,這將在未來(lái)的章節(jié)中進(jìn)一步介紹。
更新數(shù)據(jù)集觀測(cè)
使用?UPDATE?語(yǔ)句可以對(duì)數(shù)據(jù)集中的觀測(cè)進(jìn)行更新。?SET?子句指定更新的變量和數(shù)據(jù),?WHERE?子句指定篩選條件,符合 WHERE 條件的觀測(cè)才會(huì)被更新。如果未指定 WHERE 子句,則會(huì)更新所有觀測(cè)。
↑向右滑動(dòng)查看全部代碼↑
上述代碼更新了數(shù)據(jù)集 DM 中所有已入組(?RANDFL = "Y"?)的受試者的體重指數(shù)(BMI)。
SET 子句可以指定 SQL 表達(dá)式作為更新后的值,但該 SQL 表達(dá)式不能包含邏輯運(yùn)算符。有關(guān) SQL 表達(dá)式的內(nèi)容將在未來(lái)的章節(jié)中詳細(xì)介紹。
新增數(shù)據(jù)集觀測(cè)
使用?INSERT?語(yǔ)句可以在數(shù)據(jù)集中新增觀測(cè)。?INTO?子句指定需新增觀測(cè)的數(shù)據(jù)集名稱,有兩種新增觀測(cè)的方式:使用?SET?或?VALUES?子句。
使用 SET 子句允許在為變量賦值時(shí),無(wú)需考慮變量賦值的順序;而 VALUE 子句在為變量賦值時(shí),賦值順序必須與 INSERT INTO 指定的變量順序或變量在數(shù)據(jù)集中的順序一致。
↑向右滑動(dòng)查看全部代碼↑
上述代碼為數(shù)據(jù)集 DM 新增了 3 行觀測(cè),分別為 SET 子句新增的一條觀測(cè)和 VALUES 子句新增的兩條觀測(cè)。
在新增觀測(cè)時(shí),INSERT 語(yǔ)句未指定但存在于數(shù)據(jù)集中的變量將會(huì)被賦予缺失值,若 INSERT 語(yǔ)句未指定任何變量,則相當(dāng)于指定了數(shù)據(jù)集中的所有變量。例如,下述代碼可以將一條完整的觀測(cè)追加到數(shù)據(jù)集 DM 的最后一條觀測(cè)中。
↑向右滑動(dòng)查看全部代碼↑
刪除數(shù)據(jù)集觀測(cè)
使用?DELETE?語(yǔ)句可以對(duì)數(shù)據(jù)集中的觀測(cè)進(jìn)行刪除。?WHERE?子句指定篩選條件,符合條件的觀測(cè)才會(huì)被刪除。如果未指定 WHERE 子句,則會(huì)刪除所有觀測(cè)。
上述代碼刪除了數(shù)據(jù)集 DM 中所有未入組(?RANDFL ^= "Y"?)的受試者的觀測(cè)。



