8-10 SQL(4)その他

表の定義

CREATE TABLE文を用いて、表(テーブル)を定義(作成)することができます。

例 CREATE TABLE 社員(
      社員番号 DEC(4),
      氏名 NCHAR VARYING(10) NOT NULL,
      性別 CHAR,
      生年月日 DATE,
      部署コード CHAR(4),
      PRIMARY KEY (社員番号),
      FROREIGN KEY (部署コード) REFERENCES 部署(部署コード),
      CHECK  (性別 = ’M’ OR 性別 = ’F’)) 

1.列定義
列定義は、社員番号、氏名、生年月日、部署コードの部分で、列名のあとにデータ型を指定します。また、必要に応じて列制約を定義します。

データ型短縮形内容
INTEGERINT符号付き整数
NUMERIC(p,q)けた数(精度)がP、小数点以下がqけたの10進数
qを省略した場合、小数点なし
pを省略した場合、処理系に依存
DECIMAL(p,q)DEC(p,q)けた数(精度)が少なくともP、小数点以下がqけたの10進数
p・q省略した場合、NUMERICと同様
CHARACTER(n)CHAR(n)n文字の固定長1バイト文字
nを省略した場合、n=1とみなされる
CHARACTER VARYING(n)VARCHAR(n)最大n文字の可変長1バイト文字
nを省略した場合、n=1とみなされる
NATION CHARACTER(n)NRCHAR(n)最大n文字の固定長2バイト文字
nを省略した場合、n=1とみなされる
NATION CHARACTER VARYING(n)NCHAR VARYING(n)最大n文字の可変長2バイト文字
nを省略した場合、n=1とみなされる
DATEyyyy-mm-dd形式の日時

2.列制約
 列制約は、その列に対する制約で、列定義に含まれます。
NOT NULLが該当します。
列制約に違反する(挿入や更新など)は許可されません。

NOT NULL列の値が空値となってはならない(非ナル制約)
UNIQE表中で一意の値をとらなければならない
PRIMAY KEY主キーの定義(主キー制約)
REFERENS <表名>(<表名>)<表名>で指定した表の<列名>を参照する(参照制約)

3.主キーと外部キー
 主キーと外部キーは、単一に列であれば列制約と表制約のどちらでも定義でき、複数列の組み合わせであれば表制約で定義します。
 表制約では、主キーはPRIMARY KEYで定義します。列の組合せが主キーである場合(複合キー)は、

  PRIMARY KEY(列名1, 列名2,・・・・・)

と列名を列挙して指定します。
 同様に表制約では、外部キーはFOREIGN KEYで定義します。列を指定した後には、REFERENCES以降に参照する表とその主キー(または一意性のある列)を指定します。
例えば、「部署コードを、部署表の部署コードを参照する外部キーとする」のであれば

  FOREIGN KEY (部署コード) REFERENCES 部署(部署コード)

のように記述します。

4.検査制約
 検査制約はmその列が満たすべき条件を設定し、不正な設定がされていなようにするための制約です。表制約と列制約のどちらでも設定することが可能でCHEACKに続けて条件を設定します。

CHECK(給与 BETWEEN 100000 AND 300000)給与は10万円から30万円の間である
CHECK(給与 >= 100000 AND 給与 <= 300000)同上
給与は10万円以上かつ30万円以下である
CHECK 性別 IN (’M’ , ’F’)性別は’M’か’F’のいずれか
CHECK (性別 = ’M’ OR 性別 = ’F’)同上
性別は’M’か’F’

 

権限定義

定義した表に関する処理権限を定義するには、GRANT文を用います。

 GRANT <動作リスト> ON <表名> TO  <ユーザ名リスト>

動作リストには、SELECTやINSERTといった各ユーザに許可したい動作を列挙して指定します。

 

データ操作

・行の挿入
例 INSERT INTO 社員 VALUES (’0005′ , ‘長谷川’ , ‘M’ , ‘1980-01-10’ , ‘SYS1’)
 または、INSERT INTO 社員(社員番号 , 氏名)VALUES (’0005′ , ‘長谷川’)
         列を指定することもできる、指定しない列の値はNULLまたはデフォルト値

・行の削除
例 DELETE FROM 社員 WHERE 社員番号 = ‘0005’
  社員番号0005の行を、社員表から削除する

・行の更新
例 UPDATE 社員 SET 部署コード = ‘MNG1’ WHERE 社員番号 = ’0005’
  社員番号0005の行の部署コードをMNG1に更新する

 

実表とビュー

実表 〜 実際に存在する表
ビュー(仮想表) 〜 実表からデータを抜いたり加工して、ユーザが使いやすい形に一時的(仮想的)な表
 3層スキーマアーキテクチャでは概念スキーマが実表に該当し、外部スキーマがビューに該当します。

 

ビュー定義

 ビューはCREATE VIEW文で定義します。ビューは実表と同じように扱うことができますが、実際には利用者の見えないところで指定されたSELECT文が実行され、その結果を実表のように見せているだけです。

 CREATE VIEW <ビュー名>(<列名リスト>) AS <SELECT文>

例 CREATE VIEW 基本人件費(部署コード, 部署名, 月人件費)
   AS SELECT 部署.部署コード, 部署.部署名, SUM(基本給)
      FROM 社員, 部署
      WHERE 社員.部署コード = 部署.部署コード
      GROUP BY 部署.部署コード, 部署.部署名

なお、ビューに対してINSERT文、UPDATE文、DELETE文などを実行することで、ビューのデータを更新することもできます。ただし更新が可能なビューは、ビューのデータを更新するとビューの元となる実表に反映されます。なお、上のビューは「グループ化」が行われているので更新できません。

プログラムからのSQLの呼び出し

 プログラムからSQLを呼び出す方法には、埋込み方式モジュール方式があります。
埋込み方式では、カーソルを操作します。カーソルは、SQL文の問合せを1行ずつ取り出すための仕組みです。
モジュール方式では、ストアドプロシージャ(手続きをデータベースサーバに格納しておく)に発展します。ネットワークの通信量を軽減できます。