SQLで「テーブル作成」を行う「データベーススペシャリスト試験」戦略的学習のススメ(16)(1/3 ページ)

あの“津崎さん”も保有する難関資格「データベーススペシャリスト」。本企画では、データベーススペシャリスト試験 午前/午後試験対策のための「基礎知識」を抜粋してお届けします。今回は、「SQLでのテーブル作成の基礎」を解説します。

» 2017年08月08日 05時00分 公開

連載目次

ポケットスタディ データベーススペシャリスト [第2版]

書籍の中から有用な技術情報をピックアップして紹介する本シリーズ。今回は、秀和システム発行の書籍ポケットスタディ データベーススペシャリスト [第2版](2015年12月22日発行)』からの抜粋です。

ご注意:本稿は、著者及び出版社の許可を得て、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。


※編集部注:前回記事「SQLで「データ追加/更新/削除」を行う」はこちら

SQLによるテーブル作成

出題頻度 午前II:●●- 午後I:●-- 午後II:●--


 ●--:過去14年間での過去問出題数が1〜9回
 ●●-:過去14年間での過去問出題数が10〜19回
 ●●●:過去14年間での過去問出題数が20回以上


Key Word

CREATE TABLE文、データ型、制約条件、制約条件によるデータ操作の制限、参照制約のオプション、CASCADE、CONSTRAINT、午後演習、DROP TABLE


 SQLには、データ定義言語(DDL : Data Definition Language)とデータ操作言語(DML : Data Manipulation Language)の2種類があります。

 ここではデータ定義言語について説明します。

CREATE TABLE文によるテーブル作成

 以下はCREATE TABLE文の基本使用方法です。必要な列の数だけ「列名 データ型 [列制約]」を「,」で区切りながら繰り返し記述し、テーブルを作成します。同時に、列やテーブルの制約も作成します。

構文 CREATE TABLE テーブル名
     (列名 データ型 (データ長) [列制約],
      ・・・,
      ・・・,
      [テーブル制約])
テーブル名 作成するテーブルの名前を定義
列名 テーブルの列を定義
データ型 列のデータ型を定義【→後述「データ型の定義」
データ長 列のデータの長さを指定【→後述「データ型の定義」
列制約 列制約を定義【→後述「制約条件の定義」
テーブル制約 テーブル制約を定義【→後述「制約条件の定義」

 制約条件には、列の定義毎に末尾に記述する「列制約」と、テーブル定義全体の末尾に記述する「テーブル制約」がありますが、ほぼ同じ制約をどちらの記述で表現することもできますので、表現方法が2種類あると考えて下さい。

データ型の定義

 CREATE TABLE文では、以下のデータ型を利用することができます。

区分 データ型 内容
整数 INTEGER 整数値(- 2,147,483,648 〜+ 2,147,483,647)
NUMERIC 小数点を含む整数。DECIMAL でも可能。
文字列 CHAR 固定長の文字列
VARCHAR 可変長の文字列
日付 DATE 日付
TIMESTAMP 日付と時刻
※NUMERIC(n, m)と指定すれば、全体でn桁、小数部がm桁という意味になります

制約条件の定義

 CREATE TABLE文では、以下の制約条件や初期値を利用することができます。

区分 制約 構文 説明
初期値 - DEFAULT ‘2405’ 初期値を「2405」に設定
DEFAULT NULL 初期値をNULL に設定
非NULL制約 列制約 NOT NULL 該当列はNULL 値が入らないという制約条件を設定
一意性制約 列制約 UNIQUE 該当列は同じ値が複数入らないという制約条件を設定
テーブル制約 UNIQUE(列名)
主キー制約 列制約 PRIMARY KEY 主キーを設定(該当列は同じ値が複数入らず、NULL値も設定できない)
テーブル制約 PRIMARY KEY(列名,・・・)
検査制約 列制約 CHECK(列名<100) 括弧内に指定した条件に合致する値しか入らない(括弧内に列名を用いた条件を指定)
テーブル制約
参照制約 列制約 REFERENCESテーブル名(列名) 該当テーブルの該当列を参照する外部キーを設定
テーブル制約 FOREIGN KEY(列名)
REFERENCES テーブル名(列名)
FOREIGN KEY(列名)で示す列に、該当テーブルの該当列を参照する外部キーを設定
※初期値を設定しておくと、行の追加時に値を指定しなくても初期値が設定されます

 以上を踏まえ、テーブル定義の例を示します。ここでは主キーと外部キーを「列制約」で記述しています。

テーブル定義の例 各行の意味
CREATE TABLE 社員
( 社員番号 CHAR(6) PRIMARY KEY,
社員名 CHAR(20) NOT NULL,
血液型 CHAR(2) DEFAULT NULL,
所属部門番号 CHAR(4) REFERENCES 部門(部門番号))
・社員テーブルを定義
・社員番号を主キーに設定
・社員名はNULL 不可
・血液型の初期値はNULL
・ 所属部門番号を、部門テーブルの「部門番号」列を参照する外部キーに設定

 主キーと外部キーを、「テーブル制約」で記述すると次のようになります。

テーブル定義の例 各行の意味
CREATE TABLE 社員
( 社員番号 CHAR(6) NOT NULL,
 社員名 CHAR(20) NOT NULL,
 血液型 CHAR(2) DEFAULT NULL,
所属部門番号 (CHAR(4),
PRIMARY KEY ( 社員番号)
FOREIGN KEY ( 所属部門番号)
     REFERENCES 部門 (部門番号))




・社員番号を主キーに設定
・所属部門番号を、部門テーブルの「部門番号」列を参照する外部キーに設定

参照制約によるデータ操作の制限

 参照制約(外部キー)を設定すると、整合性を守るため、データ操作時に次のような制限がかかります。制限に反する処理はエラーとなります。

参照制約によるデータ操作の制限

 よって、データを削除する場合は「社員テーブル」から、データを追加する場合は「部門テーブル」から順に行わなければなりません。

参照制約のオプション

 以下の例のように、外部キーに対してCASCADESET NULLなど参照制約のオプションを設定すると、参照関係にあるデータを更新・削除する際にまとめて処理することができます。

参照制約のオプション

 参照制約のオプションは、次のように外部キーの定義の直後に記述します。

CREATE TABLE 社員
(社員番号 CHAR(6) PRIMARY KEY
 所属部門番号 CHAR(4) REFERENCES 部門(部門番号)
 ON DELETE CASCADE)
CREATE TABLE 社員
(社員番号 CHAR(6) PRIMARY KEY
 所属部門番号 CHAR(4)
 FOREIGN KEY (所属部門番号) REFERENCES 部門(部門番号)
ON DELETE CASCADE)

CONSTRAINTによる制約名の付与

 以下の例のように、列制約やテーブル制約の指定の直前にCONSTRAINTを利用すると、その制約に名前を付けることができます。名前を付けると、ALTER TABLEにより、名前を指定して制約を削除することができます。

CREATE TABLE 社員
 (社員番号 CHAR(6)
  CONSTRAINT 社員テーブル主キー PRIMARY KEY)
       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。