一般にSASではSQL文を使ってデータテーブルを操作することができます。
これが使えるのはありがたいなぁと思う便利機能の一つです。
SQLとは
SQLとは、リレーショナルデータベースにおいてデータの操作や定義を行うためのデータベース言語です。
実はSQLはデータベース言語の国際標準であり、その意味において何かの略語ではないとされています。
狭義の意味でStructured Query Languageと紹介されることもあります。
SQLは国際標準の言語なので、MySQLやPostgreSQLなどデータベースが変わったとしても、ほぼ同じSQLで操作することが可能です。
そのためSQLの基本的な考え方を1度習得できれば、どのようなプログラミング言語でも通用するというわけです。
クエリとは
クエリ(Query)とは、英語で問い合わせるという意味です。
ここではデータベースに対するデータの抽出や更新などの処理要求を意味します。
つまりSQLという言語でデータベースにクエリを出すわけですね。
SQL Procedureの仕組み
SASではSQL Procedureでクエリを実行することができます。
PROC SQL;
からQUIT;
が実行されるまでの間に記載されたクエリを上から順番に実行していきます。
クエリ自体は1つ1つすぐに実行されるため、RUN;
は不要です。
IML Procedureみたいな感じですね。
たとえば、以下のようにQUITではなくRUNを記載しているコードを実行してみます。
RUNは不要
PROC SQL;
validate
select *
from sashelp.class
;
RUN;
その結果、ログには「NOTE: PROC SQLステートメントはすぐに実行されるため、RUNステートメントは必要ありません。」と表示されます。
そしてウィンドウのヘッダーを見たらわかるように、またSQL Procedureは実行中のままです。
QUIT;
を実行するとProcedureがきちんと終了します。
SASにおけるSQLの基本
SELECT文について、SASの標準データセットであるCLASSを例に説明します。
複数のクエリをまとめて実行する場合は必ず";(セミコロン)"でそれぞれのクエリを閉じる必要があります。
SQLの基本
option nolabel;
PROC SQL;
/*-------------------------------------------*
SELECT文の基本
select ("*" もしくは "列名"を指定)
from ("データテーブル名"を指定)
; (最後はセミコロンでクエリを閉じる)
指定する列名はラベル名ではないので注意
*-------------------------------------------*/
/* "*"はすべてという意味 */
select * from sashelp.class;
/* 上のクエリと同じ結果が得られる */
select name, sex, age, height, weight from sashelp.class;
/* 改行してもしなくても結果は同じなので、読みやすいように工夫してOK */
select
name,
sex,
age,
height,
weight
from
sashelp.class;
QUIT;
option label;
SQLステートメント一覧
SASにおけるSQLのステートメントとその概要の一覧を示します。
順次紹介していきます。
SASにおけるSQL文の基本構造
PROC SQL;
SELECT; /* 特定の列と行を取得する。もっとも基本的な構文 */
INSERT; /* 行の追加 */
DELETE; /* 行の削除 */
ALTER TABLE; /* 列の追加・削除、列情報の変更 */
UPDATE; /* 値の更新 */
DROP; /* データテーブル、ビュー、インデックスの削除 */
CREATE INDEX; /* インデックスを作成 */
CREATE TABLE; /* クエリ結果から新しいテーブルを作成 */
CREATE VIEW; /* クエリ結果から新しいビュー(読み込み専用のテーブル)を作成 */
CONNECT; /* 他のデータベース管理システム(DBMS)とのコネクションを作成 */
DESCRIBE; /* テーブルの定義を表示 */
DISCONNECT; /* コネクションを切断 */
EXECUTE; /* SAS内ではなく、コネクションを作成したDBMS上でSQLを実行 */
RESET; /* DOUBLEなどのオプションのリセット */
VALIDATE; /* SQL文に間違いがないかを確認 */
QUIT; /* PROC SQLではRUN;ではなくQUITで閉じる */