SQL テーブル作成ステートメントの詳細解説

SQLにおいて、テーブルの作成はデータベース設計の基本です。各テーブルは行と列で構成され、その作成には列名、データ型、制約などの定義が含まれます。本記事ではSQLでのテーブル作成ステートメントについて詳しく解説し、例を通じて理解を深めます。

1. 基本的な文法

テーブルを作成する基本的な文法は以下の通りです:
CREATE TABLE テーブル名 (
    列A データ型 制約,
    列B データ型 制約,
    列C データ型 制約,
    ...
);
- `テーブル名`:テーブルの名称。 - `列A, 列B, 列C`:列の名称。 - `データ型`:列のデータタイプ。 - `制約`:列の条件。

2. データタイプ

SQLでは以下のデータタイプが一般的に使用されます: - **整数型**:`INTEGER`, `BIGINT`, `SMALLINT`, `TINYINT` - **浮動小数点型**:`FLOAT`, `DOUBLE`, `NUMERIC(p, s)` - **文字列型**:`CHAR(n)`, `VARCHAR(n)`, `TEXT` - **日付・時刻型**:`DATE`, `TIME`, `DATETIME`, `TIMESTAMP` - **ブール型**:`BOOLEAN`

3. 制約

データの一貫性や整合性を保証するために使用される制約には以下のようなものがあります: - **主キー制約**:`PRIMARY KEY`、各レコードを一意に識別。 - **ユニーク制約**:`UNIQUE`、列内の全ての値が一意であることを確保。 - **非NULL制約**:`NOT NULL`、列内の値がNULLであってはならない。 - **デフォルト値制約**:`DEFAULT`、列にデフォルト値を提供。 - **外部キー制約**:`FOREIGN KEY`、他のテーブルとのデータ整合性を保証。 - **チェック制約**:`CHECK`、列内の値が特定の条件を満たすことを確認。

4. 実際の例

具体的な例として、学生情報を保存する`students`というテーブルを作成します。このテーブルには学籍番号、氏名、性別、誕生日、クラスIDを含みます。
CREATE TABLE 学生情報 (
    学籍番号 INT PRIMARY KEY,
    氏名 VARCHAR(50) NOT NULL,
    性別 CHAR(1) CHECK (性別 IN ('M', 'F')),
    誕生日 DATE,
    クラスID INT,
    FOREIGN KEY (クラスID) REFERENCES クラス(クラスID)
);
ここでは、`学籍番号`が主キー、`氏名`は必須項目、`性別`は'M'または'F'のみ許容、`誕生日`は任意、`クラスID`は別のテーブルへの外部キーです。

5. デフォルト値付きテーブルの作成

例えば入学日をデフォルト値として設定できます:
CREATE TABLE 学生情報 (
    学籍番号 INT PRIMARY KEY,
    氏名 VARCHAR(50) NOT NULL,
    性別 CHAR(1) CHECK (性別 IN ('M', 'F')),
    誕生日 DATE,
    クラスID INT,
    入学日 DATE DEFAULT CURRENT_DATE,
    FOREIGN KEY (クラスID) REFERENCES クラス(クラスID)
);
ここでは`入学日`は現在の日付がデフォルト値となります。

6. 複合主キーを使用したテーブルの作成

複数の列を主キーとして使用する場合、例えば注文表の注文IDと商品IDを併用することがあります。
CREATE TABLE 注文明細 (
    注文ID INT,
    商品ID INT,
    数量 INT,
    PRIMARY KEY (注文ID, 商品ID),
    FOREIGN KEY (注文ID) REFERENCES 注文(注文ID),
    FOREIGN KEY (商品ID) REFERENCES 商品(商品ID)
);

7. チェック制約付きテーブルの作成

年齢が18歳以上30歳以下であることを保証するような制約も可能です。
CREATE TABLE 学生情報 (
    学籍番号 INT PRIMARY KEY,
    氏名 VARCHAR(50) NOT NULL,
    性別 CHAR(1) CHECK (性別 IN ('M', 'F')),
    誕生日 DATE,
    クラスID INT,
    入学日 DATE DEFAULT CURRENT_DATE,
    年齢 INT CHECK (年齢 >= 18 AND 年齢 <= 30),
    FOREIGN KEY (クラスID) REFERENCES クラス(クラスID)
);

8. ユニーク制約付きテーブルの作成

メールアドレスが一意であることを保証する場合:
CREATE TABLE 学生情報 (
    学籍番号 INT PRIMARY KEY,
    氏名 VARCHAR(50) NOT NULL,
    性別 CHAR(1) CHECK (性別 IN ('M', 'F')),
    誕生日 DATE,
    クラスID INT,
    入学日 DATE DEFAULT CURRENT_DATE,
    メール VARCHAR(100) UNIQUE,
    FOREIGN KEY (クラスID) REFERENCES クラス(クラスID)
);

9. 自動増分列付きテーブルの作成

自動生成される識別子を使用する場合、例えば学籍番号を自動的に生成することができます。
CREATE TABLE 学生情報 (
    学籍番号 INT AUTO_INCREMENT PRIMARY KEY,
    氏名 VARCHAR(50) NOT NULL,
    性別 CHAR(1) CHECK (性別 IN ('M', 'F')),
    誕生日 DATE,
    クラスID INT,
    入学日 DATE DEFAULT CURRENT_DATE,
    FOREIGN KEY (クラスID) REFERENCES クラス(クラスID)
);

10. コメント付きテーブルの作成

コメントを追加してテーブルや列の説明を付け加えることも可能です。
CREATE TABLE 学生情報 (
    学籍番号 INT AUTO_INCREMENT PRIMARY KEY COMMENT '学生の一意識別',
    氏名 VARCHAR(50) NOT NULL COMMENT '学生の氏名',
    性別 CHAR(1) CHECK (性別 IN ('M', 'F')) COMMENT '学生の性別',
    誕生日 DATE COMMENT '学生の誕生日',
    クラスID INT COMMENT '学生の所属クラス',
    入学日 DATE DEFAULT CURRENT_DATE COMMENT '学生の入学日',
    FOREIGN KEY (クラスID) REFERENCES クラス(クラスID)
) COMMENT='学生情報のテーブル';

タグ: SQL データベース設計 テーブル作成 制約 データタイプ

6月10日 19:31 投稿