10  データ定義言語

データ定義言語(Data Definition Language, DDL)は,データを定義するためのSQL文を指す.DDLは,テーブルの作成,変更,削除など,データベースの構造を定義するために使用される.DDLの主なコマンドには,CREATEALTERDROPなどがある.さらに,制約(constraints)を使用して,データの整合性を保つためのルールを定義することもできる.

10.1 テーブルの作成

CREATE TABLE文は,新しいテーブルを作成するために使用される.書式は次のとおりである.

CREATE TABLE table_name (
    column1_name data_type,
    column2_name data_type,
    ...
);
ノートSQLの基本ルール
  • 文末にはセミコロン;を付ける
  • 予約語は大文字で記述する

table_nameには,作成するテーブルの名前を指定する.

column1_namecolumn2_nameには,テーブルの列名を指定する.

data_typeには,列のデータ型を指定する.SQLiteでは,全ての値は,次の5つのstorage classのいずれかに分類される.

  • NULL
  • INTEGER
  • REAL
  • TEXT
  • BLOB
ノートNULLとBLOB

NULLは,「ナル」または「ヌル」と呼ばれ,値が存在しないことを表すデータ型である.英語では「nʌl」と発音される.

BLOBは,Binary Large Objectの略で,画像や音声などのバイナリデータを格納するためのデータ型である.

例として,usersというテーブルを作成する場合は,次のようにする.

CREATE TABLE users (
    ID TEXT,
    Name TEXT,
    Age INTEGER
);

10.1.1 データの追加

テーブルを作成した後,データを追加するには,INSERT INTO文を使用する.書式は次のとおりである.

INSERT INTO table_name (column1_name, column2_name, ...)
VALUES (value1, value2, ...);

次の例では,usersテーブルにデータを追加する.

INSERT INTO users (ID, Name, Age)
VALUES ('001', 'Alice', 25);

INSERT文は,DDLではなく,データ操作言語(DML)に分類される.説明の都合上,ここに記載している.

10.2 テーブルの変更

ALTER TABLE文は,既存のテーブルを変更するために使用される.

10.2.1 列の追加

ADD COLUMNを使用して,テーブルに新しい列を追加することができる.書式は次のとおりである.

ALTER TABLE table_name
ADD COLUMN column_name data_type;

次の例では,usersテーブルにEmail列を追加する.

ALTER TABLE users
ADD COLUMN Email TEXT;

10.2.2 列の削除

DROP COLUMNを使用して,テーブルから列を削除することができる.書式は次のとおりである.

ALTER TABLE table_name
DROP COLUMN column_name;

次の例では,usersテーブルからEmail列を削除する.

ALTER TABLE users DROP COLUMN Email;
ノート古いバージョンでの注意

古いバージョンのSQLiteでは,この機能がサポートされていない場合がある.

10.3 テーブルの削除

DROP TABLE文は,テーブルを削除するために使用される.書式は次のとおりである.

DROP TABLE table_name;

次の例では,usersテーブルを削除する.

DROP TABLE users;

10.4 練習1

  1. students(StudentID, Name, Age, Email)というテーブルを作成せよ.
  2. studentsテーブルに,Address列を追加せよ.
  3. studentsテーブルに,INSERT INTO文を使用して,任意のデータを追加せよ.
  4. studentsテーブルを削除せよ.

10.5 制約

10.5.1 主キー

主キー(primary key)はタプルを一意識別するために使用される.

10.5.1.1 主キーの指定(1)

SQLiteでは,主キーはテーブル作成時に指定することができる.

CREATE TABLE table_name (
    column1_name data_type PRIMARY KEY,
    column2_name data_type,
    ...
);

以下の例では,ID列を主キーとして指定している.

CREATE TABLE users (
    ID TEXT PRIMARY KEY,
    Name TEXT,
    Age INTEGER
);

10.5.1.2 主キーの指定(2)

複数の列を組み合わせて主キーを指定することもできる.

CREATE TABLE table_name (
    column1_name data_type,
    column2_name data_type,
    ...,
    PRIMARY KEY (column1_name, column2_name)
);

以下の例では,StudentIDCourseIDの2つの列を主キーとして指定している.

CREATE TABLE scores (
    StudentID TEXT,
    CourseID TEXT,
    Score INTEGER,
    PRIMARY KEY (StudentID, CourseID)
);

10.5.2 外部キー

外部キー(foreign key)は,他のテーブルの主キーを参照するために使用される.外部キーは,リレーション間の関係を表現するための制約である.

10.5.2.1 外部キーの指定(1)

SQLiteでは,外部キーはテーブル作成時に指定することができる.

CREATE TABLE table_name (
    column_name data_type REFERENCES other_table(column_name),
    ...
);

例えば,employees(EmployeeID, Name, DepartmentID)とdepartments(DepartmentID, DepartmentName)という2つのテーブルがあるとする.employeesテーブルのDepartmentID列は,departmentsテーブルのDepartmentID列を参照する外部キーとして指定できる.

CREATE TABLE departments (
    DepartmentID TEXT PRIMARY KEY,
    DepartmentName TEXT
);

CREATE TABLE employees (
    EmployeeID TEXT PRIMARY KEY,
    Name TEXT,
    DepartmentID TEXT REFERENCES departments(DepartmentID)
);

10.5.2.2 外部キーの指定(2)

外部キーは,下記のように指定することもできる.

CREATE TABLE table_name (
    column1_name data_type,
    column2_name data_type,
    ...,
    FOREIGN KEY (column1_name) REFERENCES other_table(column_name)
);

以下の例では,employeesテーブルのDepartmentID列が,departmentsテーブルのDepartmentID列を参照する外部キーとして指定されている.

CREATE TABLE departments (
    DepartmentID TEXT PRIMARY KEY,
    DepartmentName TEXT
);

CREATE TABLE employees (
    EmployeeID TEXT PRIMARY KEY,
    Name TEXT,
    DepartmentID TEXT,
    FOREIGN KEY (DepartmentID) REFERENCES departments(DepartmentID)
);

10.5.3 NOT NULL制約

NOT NULL制約は,列にNULL値を許可しないことを指定する.NOT NULL制約は以下のように指定する.

CREATE TABLE table_name (
    column_name data_type NOT NULL,
    ...
);

以下の例では,Name列にNOT NULL制約を指定している.

CREATE TABLE users (
    ID TEXT PRIMARY KEY,
    Name TEXT NOT NULL,
    Age INTEGER
);

NOT NULL制約を指定されていない列はNULL値を許可する.この例では,Age列はNULL値を許可する.

10.5.4 UNIQUE制約

UNIQUE制約は,列の値が一意であることを指定する.UNIQUE制約は以下のように指定する.

CREATE TABLE table_name (
    column_name data_type UNIQUE,
    ...
);

以下の例では,Email列にUNIQUE制約を指定している.

CREATE TABLE users (
    ID TEXT PRIMARY KEY,
    Name TEXT,
    Email TEXT UNIQUE
);

10.5.5 CHECK制約

CHECK制約は,列の値が特定の条件を満たすことを指定する.CHECK制約は以下のように指定する.

CREATE TABLE table_name (
    column_name data_type CHECK (expression),
    ...
);

以下の例では,Age列にCHECK制約を指定している.ユーザーの年齢は18歳以上でなければならない.

CREATE TABLE users (
    ID TEXT PRIMARY KEY,
    Name TEXT,
    Age INTEGER CHECK (Age >= 18)
);

ANDORを使用して複数の条件を組み合わせることもできる.

CREATE TABLE users (
    ID TEXT PRIMARY KEY,
    Name TEXT,
    Age INTEGER CHECK (Age >= 18 AND Age <= 65)
);

テーブルレベルの制約を指定することもできる.書式は次のとおりである.

CREATE TABLE table_name (
    column1_name data_type,
    column2_name data_type,
    ...,
    CONSTRAINT constraint_name CHECK (expression)
);

以下の例では,products(ProductID, ProductName, Price, DiscountPrice)というテーブルに,Price >= DiscountPriceという制約を指定している.

CREATE TABLE products (
    ProductID TEXT PRIMARY KEY,
    ProductName TEXT,
    Price REAL,
    DiscountPrice REAL,
    CONSTRAINT PriceCheck CHECK (Price >= DiscountPrice)
);

10.5.6 DEFAULT制約

DEFAULT制約は,列にデフォルト値を指定する.DEFAULT制約は以下のように指定する.

CREATE TABLE table_name (
    column_name data_type DEFAULT default_value,
    ...
);

以下の例では,Age列にデフォルト値として18を指定している.

CREATE TABLE users (
    ID TEXT PRIMARY KEY,
    Name TEXT,
    Age INTEGER DEFAULT 18
);

10.6 練習2

  1. departments(DepartmentID, DepartmentName)というテーブルを作成せよ.
    • DepartmentIDは主キーとする
    • DepartmentNameはNULLを許可しない制約を付けよ.
  2. students(StudentID, Name, Age, Email, DepartmentID)というテーブルを作成せよ.
    • StudentIDは主キーとする.
    • EmailはUNIQUE制約を付けよ.
    • DepartmentIDはdepartmentsテーブルの外部キーとする.
    • Ageは18歳以上でなければならない制約を付けよ.
  3. courses(CourseID, CourseName, Credits)というテーブルを作成せよ.
    • CourseIDは主キーとする.
    • Creditsは1以上の整数でなければならない制約を付けよ.
  4. scores(StudentID, CourseID, Score)というテーブルを作成せよ.
    • StudentIDはstudentsテーブルの外部キーとする.
    • CourseIDはcoursesテーブルの外部キーとする.
    • Scoreは0以上100以下の整数でなければならない制約を付けよ.