SQL(Structured Query Language)は、データベースの管理や操作に使用される言語です。SQLでは、データベース内のデータを格納、取得、更新、削除するための命令を記述します。この記事では、SQLのデータ型やそれに関連する制約(制限)について、完全かつ包括的に説明します。
1. SQLのデータ型とは
SQLのデータ型は、データベース内で格納されるデータの種類を定義するものです。各データ型は、格納できる値の種類や範囲を決定します。主なデータ型は以下の通りです。

1.1 数値型
数値型は、整数や浮動小数点数などの数値を格納するためのデータ型です。
-
INT(整数型)
整数値を格納するためのデータ型です。通常、-2,147,483,648から2,147,483,647までの範囲の整数を格納できます。 -
SMALLINT(小さな整数型)
より小さな範囲の整数を格納します。通常、-32,768から32,767までの値を格納できます。 -
BIGINT(大きな整数型)
非常に大きな範囲の整数を格納できる型です。通常、-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの範囲をカバーします。 -
DECIMAL(固定小数点型)
小数を扱うための型で、精度とスケールを指定できます。例えば、DECIMAL(10,2)
は、10桁の数値のうち、小数点以下2桁を格納することができます。 -
FLOAT(浮動小数点型)
浮動小数点数を格納するための型です。大きな範囲の数値を格納できますが、精度が必要な場合にはDECIMAL
を使用することが推奨されます。
1.2 文字列型
文字列型は、文字や文字列を格納するためのデータ型です。
-
CHAR(固定長文字列型)
固定長の文字列を格納するための型です。例えば、CHAR(10)
は、10文字分の固定長の文字列を格納します。もしデータが短ければ、空白で埋められます。 -
VARCHAR(可変長文字列型)
可変長の文字列を格納するための型です。VARCHAR(255)
は最大255文字の文字列を格納できますが、実際に格納するデータの長さに応じてメモリを節約できます。 -
TEXT(テキスト型)
長い文字列を格納するための型です。VARCHAR
の最大サイズを超えるような大量のテキストデータを扱う際に使用されます。
1.3 日付と時刻型
日付や時刻に関する情報を格納するための型です。
-
DATE(日付型)
年月日を格納するための型です。形式はYYYY-MM-DD
です。 -
TIME(時刻型)
時間を格納するための型です。形式はHH:MM:SS
です。 -
DATETIME(日時型)
日付と時刻を組み合わせたデータ型です。形式はYYYY-MM-DD HH:MM:SS
です。 -
TIMESTAMP(タイムスタンプ型)
UTC(協定世界時)を基準にした日時を格納する型で、通常はDATETIME
と同様の形式ですが、データベースのシステムによっては自動的に現在の日時を格納する機能が組み込まれている場合もあります。
1.4 論理型(ブール型)
-
BOOLEAN(ブール型)
真または偽の値(TRUE
またはFALSE
)を格納するためのデータ型です。
1.5 バイナリ型
-
BINARY(固定長バイナリ型)
固定長のバイナリデータを格納するための型です。例えば、BINARY(16)
は16バイトのバイナリデータを格納します。 -
VARBINARY(可変長バイナリ型)
可変長のバイナリデータを格納するための型です。
2. SQLの制約(Constraints)
制約は、データベース内のデータに対して適用されるルールや制限のことです。これにより、データの整合性が保たれます。主要な制約は以下の通りです。
2.1 主キー制約(PRIMARY KEY)
-
主キー制約は、テーブルの中で一意の値を持つ列(または複数の列)を指定するための制約です。主キー列の値は一意であり、NULLを許容しません。例えば、
id
列が主キーの場合、同じid
の値を持つレコードは存在できません。
2.2 外部キー制約(FOREIGN KEY)
-
外部キー制約は、他のテーブルの主キーに対する参照を確立するための制約です。この制約を使用すると、テーブル間の関連性を維持することができます。例えば、
orders
テーブルのcustomer_id
がcustomers
テーブルのid
を参照する場合に使用します。
2.3 一意制約(UNIQUE)
-
一意制約は、指定された列に格納されるすべての値が一意であることを保証する制約です。NULL値は許容される場合がありますが、同じ非NULL値は二度と格納できません。
2.4 NOT NULL制約
-
NOT NULL制約は、指定した列にNULL値を格納できないようにする制約です。これにより、その列には必ず値が格納されることが保証されます。
2.5 チェック制約(CHECK)
-
チェック制約は、列に格納されるデータが指定した条件を満たすようにするための制約です。例えば、
age
列が0以上
であることを保証するために、CHECK(age >= 0)
という制約を使用できます。
2.6 デフォルト制約(DEFAULT)
-
デフォルト制約は、列に値が指定されなかった場合に自動的に設定される値を指定する制約です。例えば、
status
列にデフォルトで'active'
という値を設定することができます。
2.7 インデックス制約(INDEX)
-
インデックス制約は、テーブルの検索性能を向上させるための制約です。特定の列にインデックスを作成することで、検索やソートが速くなります。ただし、インデックスの作成には追加のメモリやディスクスペースが必要です。
3. SQLデータ型と制約の使用例
以下に、SQLでデータ型と制約を使用したテーブル作成の例を示します。
sqlCREATE TABLE Employees (
employee_id INT PRIMARY KEY, -- 主キー
first_name VARCHAR(50) NOT NULL, -- NOT NULL制約
last_name VARCHAR(50) NOT NULL, -- NOT NULL制約
birth_date DATE, -- 日付型
email VARCHAR(100) UNIQUE, -- 一意制約
hire_date DATETIME DEFAULT CURRENT_TIMESTAMP, -- デフォルト制約
salary DECIMAL(10, 2) CHECK (salary > 0) -- チェック制約
);
上記の例では、Employees
というテーブルを作成しています。employee_id
は主キーとして一意の値を持ち、first_name
とlast_name
は必須(NOT NULL)です。email
は一意でなければならず、salary
は0より大きい値でなければなりません。また、hire_date
はデフォルトで現在の日時を設定するようにしています。
4. 結論
SQLのデータ型と制約は、データベース内のデータを正確かつ効率的に管理するために不可欠な要素です。適切なデータ型を使用し、