【SQL】CREATE TABLE文の書き方と使い方の基本
この記事では、データベースに新しいテーブルを作るSQLのCREATE TABLE文について、書き方と使い方を解説します。テーブルの列(カラム)の定義、扱うデータの種類を示すデータ型、そしてデータのルールを設定する制約(PRIMARY KEYやFOREIGN KEYなど)を、具体的なサンプルコードで学び、データベース設計の基本を習得できます。
開発環境
- OS: Windows10
- DatabaseGUI: TablePlus
- MySQL: 8.0.42
CREATE TABLE文とは
CREATE TABLE文は、SQLで新しいテーブルを作成するためのコマンドです。
テーブルはデータベース内でデータを整理・保存するための基本的な構造であり、行と列から構成されます。
CREATE TABLE文を使用して、テーブルの名前、カラム(列)の名前、データ型、および制約を定義します。
CREATE TABLE文の基本構文
CREATE TABLE文は、リレーショナルデータベースにおいて、新しい「表(テーブル)」を作成するためのSQLコマンドです。データベースは、データを整理して保存するための場所であり、そのデータを保存する入れ物となるのがテーブルです。システムエンジニアとしてデータを扱う上で、このテーブルをどのように設計し、作成するかは非常に重要な基本知識となります。
1CREATE TABLE テーブル名 ( 2 カラム名 データ型 [カラムの制約], 3 カラム名 データ型 [カラムの制約], 4 ... 5 [テーブルの制約] 6);
上記の構文は、データベースの中に新しいテーブルを作成するための基本的な命令文です。各要素について詳しく見ていきましょう。
-
CREATE TABLEこのキーワードは、「新しくテーブルを作成します」という命令の始まりを示します。 -
テーブル名作成するテーブルに付ける名前です。例えば、ユーザー情報を保存するテーブルならusers、商品情報を保存するテーブルならproductsのように、そのテーブルにどんなデータが保存されるのかが分かりやすい名前を付けます。 -
(と)これらの丸括弧の中には、そのテーブルがどのような「列(カラム)」を持つのか、そして各カラムやテーブル全体に対してどのような「ルール(制約)」を設けるのかを記述します。 -
カラム名 データ型 [カラムの制約]これは、テーブルの各列(項目)を定義する部分です。カンマ,で区切ることで、複数の列を定義できます。カラム名:テーブルの各列のタイトルにあたる部分です。例えば、usersテーブルであれば、「氏名」「年齢」「メールアドレス」などがこれにあたります。データ型:そのカラムにどのような種類のデータを保存するかを指定します。例えば、整数を保存するならINT、短いテキストを保存するならVARCHAR(可変長文字列)、日付を保存するならDATEなどが代表的なデータ型です。正しいデータ型を選ぶことで、データの種類を明確にし、データの整合性を保ちます。[カラムの制約]:この部分はオプションで、そのカラムに保存されるデータに対して追加のルールを設定します。例えば、「このカラムには必ずデータが入っていなければならない(NOT NULL)」といったルールを設定できます。
-
...これは、複数のカラムを定義する場合に、上記のように「カラム名 データ型 [カラムの制約]」の形式で、カンマ区切りで続けて記述することを表しています。必要な数だけカラムを定義することができます。 -
[テーブルの制約]この部分もオプションで、テーブル全体に対して設定するルールです。例えば、複数のカラムを組み合わせて、その組み合わせがテーブル内で重複しないようにする(PRIMARY KEYなど)といった、より複雑なルールを設定する場合に記述します。 -
;これはSQL文の終わりを示す記号です。これで一つの命令が完了したことをデータベースに伝えます。
SQLは、データベースを操作するための言語です。データベースには「テーブル」と呼ばれる表形式でデータが保存されており、このテーブルを構成する列を「カラム」と呼びます。
カラムには、どのような種類のデータを保存するのかを示す「データ型」と、データの整合性を保つための「制約」を設定できます。これらを適切に設定することは、データベースを効率的かつ正確に運用するために非常に重要です。
システムエンジニアとしてデータベースを扱う上で、これらの基本的な知識は不可欠ですので、一つずつ見ていきましょう。
SQLの主なカラム(データ)型と制約の一覧
数値型
数値型は、その名の通り数字を扱うデータ型です。整数や小数を区別し、それぞれの用途に応じた種類があります。
| データ型 | 用途例 |
|---|---|
| TINYINT | 小さな整数(例: フラグやステータス) |
| SMALLINT | 小〜中規模整数 |
| MEDIUMINT | 中規模整数(MySQL特有) |
| INT / INTEGER | ID, 数値 |
| BIGINT | 大きな整数(例: ユーザーID、トランザクション番号) |
| FLOAT | 成績(小数、精度はやや低め) |
| DOUBLE | 精度の高い小数 |
| DECIMAL(p,s) / NUMERIC(p,s) | 金額や正確な小数(p: 桁数, s: 小数点以下桁数) |
- TINYINT
- 非常に小さな整数を保存するのに使われます。例えば、真偽(0か1)を示すフラグや、少ない選択肢の中から状態を示すステータスなどです。
- SMALLINT
- TINYINTよりも少し大きな整数を保存する際に利用します。
- MEDIUMINT
- 中規模の整数を保存するのに使われるデータ型で、主にMySQLデータベースで利用されます。
- INT / INTEGER
- 最も一般的に使われる整数型です。テーブルの各行を一意に識別するIDや、一般的な数値データによく使われます。
- BIGINT
- 非常に大きな整数を保存するのに適しています。ユーザー数が膨大になる可能性のあるユーザーIDや、取引番号など、通常のINTでは表現しきれない場合に利用します。
- FLOAT
- 小数点を扱うデータ型ですが、精度はやや低めです。おおよその値で問題ない場合(例: 成績の点数など)に利用されます。
- DOUBLE
- FLOATよりも高い精度で小数を扱えるデータ型です。より正確な計算が必要な場合に適しています。
- DECIMAL(p,s) / NUMERIC(p,s)
- 最も高い精度で小数を扱えるデータ型です。特に金額など、誤差が許されないデータを保存する際に利用されます。
pは数値全体の桁数、sは小数点以下の桁数を指定します。
- 最も高い精度で小数を扱えるデータ型です。特に金額など、誤差が許されないデータを保存する際に利用されます。
文字列型
文字列型は、文字やテキストを扱うデータ型です。保存する文字列の長さや種類に応じて使い分けます。
| データ型 | 用途例 |
|---|---|
| CHAR(n) | 固定長文字列(例: 郵便番号、電話番号) |
| VARCHAR(n) | 可変長文字列(例: 名前、住所) |
| TEXT / TINYTEXT / MEDIUMTEXT / LONGTEXT | 長文の文字列(例: コメント、記事本文) |
| ENUM | 列挙型(例: '男','女','未回答') |
| SET | 複数選択型(MySQL特有、例: '英語','日本語','フランス語'などの組み合わせ) |
- CHAR(n)
- 固定長の文字列を保存するのに使われます。
nで指定した文字数分の領域を常に確保するため、郵便番号や電話番号のように文字数が決まっているデータに適しています。指定した文字数より短い文字列を保存しても、残りの領域は空白で埋められます。
- 固定長の文字列を保存するのに使われます。
- VARCHAR(n)
- 可変長の文字列を保存するのに使われます。
nで指定した最大文字数まで保存できますが、実際に保存する文字列の長さに応じて必要な分だけ領域を確保します。名前や住所のように文字数が変動するデータに適しており、記憶域を効率的に利用できます。
- 可変長の文字列を保存するのに使われます。
- TEXT / TINYTEXT / MEDIUMTEXT / LONGTEXT
- 長いテキストデータを保存するのに使われます。コメントや記事本文など、大量の文字を保存する際に利用します。TINYTEXTからLONGTEXTへいくにつれて、保存できる文字数が増加します。
- ENUM
- あらかじめ定義された選択肢の中から、1つの値だけを選択して保存するデータ型です。例えば、性別('男','女','未回答')のように、取りうる値が限定されている場合に利用されます。
- SET
- あらかじめ定義された選択肢の中から、複数の値を選択して保存できるデータ型です。MySQLに特有の機能で、例えば、ユーザーが複数のプログラミング言語('Java','Python','PHP'など)を習得しているといった情報を保存する際に利用できます。
日付・時間型
日付や時間を扱うデータ型です。保存したい情報に応じて適切な型を選択します。
| データ型 | 用途例 |
|---|---|
| DATE | YYYY-MM-DD(日付のみ) |
| DATETIME | YYYY-MM-DD HH:MM:SS(日時情報) |
| TIMESTAMP | 日時+タイムゾーン(例: 作成日時・更新日時の自動管理) |
| TIME | HH:MM:SS(時刻のみ) |
| YEAR | 年(YYYY形式) |
- DATE
- 日付情報のみ(年-月-日)を保存するデータ型です。
- DATETIME
- 日付と時刻の情報(年-月-日 時:分:秒)を合わせて保存するデータ型です。
- TIMESTAMP
- 日付と時刻に加えて、タイムゾーン情報も扱えるデータ型です。作成日時や更新日時など、システムが自動的に値を管理する用途によく利用されます。
- TIME
- 時刻情報のみ(時:分:秒)を保存するデータ型です。
- YEAR
- 年情報のみ(YYYY形式)を保存するデータ型です。
論理・特殊型
真偽値やバイナリデータ、構造化されたデータなど、特定の目的のために使われるデータ型です。
| データ型 | 用途例 |
|---|---|
| BOOLEAN / BOOL | true/false(フラグ管理) |
| JSON | JSON形式でデータを格納(例: 設定情報、柔軟なデータ構造) |
| BLOB / TINYBLOB / MEDIUMBLOB / LONGBLOB | バイナリデータ(例: 画像、ファイル) |
- BOOLEAN / BOOL
- 真偽値(trueまたはfalse、つまり真か偽)を保存するデータ型です。例えば、ユーザーがログインしているかどうかを示すフラグ管理などに利用されます。
- JSON
- JavaScript Object Notation (JSON) 形式のデータをそのまま格納できるデータ型です。柔軟なデータ構造を持つ設定情報や、複雑なデータを一箇所にまとめたい場合に利用されます。
- BLOB / TINYBLOB / MEDIUMBLOB / LONGBLOB
- バイナリデータを保存するためのデータ型です。画像ファイル、音声ファイル、PDFなどのファイルをデータベース内に直接保存する際に利用されます。TINYBLOBからLONGBLOBへいくにつれて、保存できるデータサイズが増加します。
制約
制約は、カラムに保存されるデータの種類や形式、他のデータとの関係性に対してルールを設けるものです。これにより、データの正確性や一貫性を保つことができます。
| 制約 | 説明 |
|---|---|
| PRIMARY KEY | 主キー、テーブル内の行を一意に識別 |
| FOREIGN KEY | 外部キー、他テーブルの主キーを参照して関連付け |
| UNIQUE | 重複禁止(同じ値を複数行に登録不可) |
| NOT NULL | 必須入力(空の値は不可) |
| DEFAULT | 初期値を設定 |
| CHECK | 値の範囲や条件を制約(例: age >= 0) |
| AUTO_INCREMENT / SERIAL | 自動採番(ID列などに使用) |
- PRIMARY KEY(主キー)
- テーブル内の各行を一意に識別するための最も重要な制約です。主キーとして指定されたカラムには、重複する値や空の値(NULL)を入れることはできません。データを取り出したり、複数のテーブルを関連付けたりする際の基準となります。
- FOREIGN KEY(外部キー)
- 他のテーブルの主キーを参照し、テーブル間の関連付けを行うための制約です。例えば、注文テーブルに顧客ID(外部キー)を設定し、顧客テーブルの顧客ID(主キー)を参照させることで、「どの顧客がどの注文をしたか」という関係性を保ち、データの整合性を維持します。
- UNIQUE
- 指定されたカラムの値がテーブル内で重複することを禁止する制約です。例えば、ユーザーのメールアドレスにはUNIQUE制約を設定し、同じメールアドレスで複数のアカウントが作成されるのを防ぐことができます。PRIMARY KEYと異なり、NULL値は許可される場合があります。
- NOT NULL
- 指定されたカラムに必ず値が入力されるようにする制約です。この制約が設定されたカラムには、空の値(NULL)を入れることはできません。例えば、ユーザー名やパスワードなど、必須の情報に設定されます。
- DEFAULT
- カラムにデータが明示的に指定されなかった場合に、自動的に設定される初期値を定義する制約です。例えば、登録日時に現在の日付を自動で設定したり、ステータスに初期値を設定したりする場合に便利です。
- CHECK
- カラムに保存される値の範囲や条件を制限する制約です。例えば、年齢カラムには「age >= 0」というCHECK制約を設定することで、負の年齢が入力されるのを防ぐことができます。
- AUTO_INCREMENT / SERIAL
- 新しいデータが追加されるたびに、そのカラムの値を自動的に増加させて採番する機能です。主にPRIMARY KEYとして使われるIDカラムに設定され、手動でIDを管理する手間を省き、重複を防ぎます。SQLデータベースシステムによってAUTO_INCREMENTやSERIALといった名称で提供されます。
サンプルコード
sql/chapter01/01.sql
このコードは、データベースに「クラス」の情報を管理するためのテーブルを作成するSQL文です。例えば、小学校の「1年1組」や「2年A組」といった情報を登録するために使われます。
1-- クラス(classes)テーブル 2CREATE TABLE classes ( 3 id INT AUTO_INCREMENT PRIMARY KEY, 4 name VARCHAR(5) NOT NULL 5);
CREATE TABLE classes: これは、「classes」という名前の新しいテーブルを作成する命令です。データベースでは、データを整理して格納するためにテーブルという箱を使います。id INT AUTO_INCREMENT PRIMARY KEY:id: これはテーブルの列名で、各クラスを一意に識別するための番号です。INT: このid列に整数(数字)を保存することを意味します。AUTO_INCREMENT: 新しいクラスのデータが追加されるたびに、このid列の値が自動的に1ずつ増えていく設定です。手動で番号を考える必要がありません。PRIMARY KEY: これは「主キー」と呼ばれ、テーブル内で各行(レコード)を特定するための特別な列です。主キーには重複する値を入れることはできず、必ず値が入っている必要があります(空にはできません)。これにより、特定のクラスを確実に識別できます。
name VARCHAR(5) NOT NULL:name: これはテーブルの列名で、クラス名(例: "1組", "A組")を保存します。VARCHAR(5): このname列に可変長文字列を保存することを意味します。カッコ内の5は、最大で5文字まで保存できることを示しています。NOT NULL: このname列には必ず値を入れる必要があるという制約です。クラス名を空にすることはできません。
sql/chapter01/02.sql
このコードは、データベースに「生徒」の情報を管理するためのテーブルを作成するSQL文です。先のclassesテーブルと連携して、どの生徒がどのクラスに所属しているかを管理できるようになります。
1-- 生徒(students)テーブル 2CREATE TABLE students ( 3 id INT AUTO_INCREMENT PRIMARY KEY, 4 last_name VARCHAR(50) NOT NULL, 5 first_name VARCHAR(50) NOT NULL, 6 class_id INT, 7 FOREIGN KEY (class_id) REFERENCES classes(id) 8);
CREATE TABLE students: これは、「students」という名前の新しいテーブルを作成する命令です。id INT AUTO_INCREMENT PRIMARY KEY:- この
id列は、studentsテーブルの各生徒を一意に識別するための主キーです。classesテーブルのidと同様に、自動で番号が増えていく整数型の主キーとして設定されています。
- この
last_name VARCHAR(50) NOT NULL:last_name: 生徒の「姓」を保存するための列です。VARCHAR(50): 最大50文字の可変長文字列を保存できます。NOT NULL: 姓は必ず入力する必要があるという制約です。
first_name VARCHAR(50) NOT NULL:first_name: 生徒の「名」を保存するための列です。VARCHAR(50): 最大50文字の可変長文字列を保存できます。NOT NULL: 名は必ず入力する必要があるという制約です。
class_id INT:class_id: この列は、生徒が所属するクラスのid(classesテーブルのid)を保存するために使われます。INTで整数を保存します。
FOREIGN KEY (class_id) REFERENCES classes(id):- これは「外部キー」という重要な設定です。
FOREIGN KEY (class_id):studentsテーブルのclass_id列を外部キーとして指定しています。REFERENCES classes(id): この外部キーが、classesテーブルのid列を参照していることを意味します。- この設定により、
studentsテーブルのclass_idには、classesテーブルに実際に存在するidしか登録できなくなります。例えば、存在しないクラスidを生徒に割り当ててしまうような間違いを防ぎ、データの一貫性を保つことができます。これにより、「この生徒はどのクラスにいるんだろう?」と調べるときに、正確なクラス情報にたどり着けるようになります。
おわりに
この記事では、データベースに新しいテーブルを作成するSQLのCREATE TABLE文について、基本的な書き方と使い方を学習しました。テーブルの列(カラム)ごとに、扱うデータの種類を示すデータ型(INTやVARCHARなど)や、データのルールを定める制約(PRIMARY KEYやNOT NULLなど)を設定することの重要性を理解しました。特に、classesテーブルとstudentsテーブルの具体的なサンプルを通して、AUTO_INCREMENTによる自動採番や、FOREIGN KEYによるテーブル間の関連付け方法を学ぶことができました。これらの基礎知識は、システムエンジニアとしてデータを正確に管理し、効率的なデータベース設計を行うための大切な一歩となります。