順番に読み進めながら学べます

テーブルの作成と定義変更

SQL のテーブル定義を基礎から学びます。CREATE TABLE による作成、PRIMARY KEY の指定、テーブル定義の確認、ALTER TABLE による列の追加・削除・改名まで、ブラウザで実行しながら押さえられます。

本講座で学ぶ SQL について

本講座で扱うのは、MySQL / Oracle / PostgreSQL / SQL Server など主要な RDBMS で共通して使える普遍的な SQL 構文 です。CREATE TABLE / SELECT / WHERE / JOIN / GROUP BY といった基礎は、どの DB に移っても同じ書き方でそのまま通用します。

ブラウザのコンソールは技術的制約から SQLite を採用していますが、DB ごとに異なる箇所(型の長さ強制、テーブル一覧の確認方法など)が出てきたら、MySQL ではこう書く のように他 DB の書き方も並べて紹介します。

テーブルとは

リレーショナルデータベースでは、データを テーブル(行と列からなる表)に格納します。1 つのテーブルは (カラム / column)と (レコード / row)で構成され、列ごとに格納できる値の データ型 が決まっています。

テーブル設計とは、どんな列を用意し、各列にどんな型を割り当てるかをあらかじめ決めることです。型が決まっていることで、想定外の値が入り込むのを防げます。

user テーブルの構造
列定義(型)1 行 = 1 レコードidINTEGERnameTEXTageINTEGERcityTEXT1Alice30Tokyo2Bob25Osaka3Carol35Tokyo
列名と型を先に決めておき、その上に行(レコード)が積まれます。各セルは列の型に従った値を持ちます。

CREATE TABLE — テーブルの作成

テーブルを作るには CREATE TABLE 文を使います。テーブル名のあとに丸括弧を書き、その中に 列名 + 型 をカンマ区切りで並べます。最後の列のあとにはカンマを置きません。

型を最初に固めておくことで、想定外のデータ(数値列に文字列が混ざる等)が入りにくくなります。

-- 列名と型を並べてテーブルを作る
CREATE TABLE book_record (
  id INTEGER,
  title TEXT,
  price INTEGER,
  published_on TEXT
);

代表的なデータ型

SQL のデータ型は DB の種類に応じて名前と細部が異なりますが、最初は次の型を覚えておけば十分です。

格納する値用途の例
INTEGER整数id / age / count
REAL浮動小数点数score / weight
TEXT文字列name / address / message
BLOBバイナリ画像・音声などのバイト列
NUMERIC数値全般(日付・真偽値含む)date / boolean を兼ねる

MySQL の VARCHAR / CHAR / DATETIME はどう書く?

MySQL や PostgreSQL では VARCHAR(255) / CHAR(13) / BOOLEAN / DATETIME といった型を細かく指定して使います。これらは本講座のコンソールでも構文上はそのまま受け付けますが、長さ強制(VARCHAR(10) で 11 文字目を弾くなど)は MySQL や PostgreSQL のような 型を厳密に扱う RDBMS で初めて意味を持ちます。

本講座の演習では、列の型を INTEGER / TEXT / REAL を中心にシンプルに書きます。MySQL に移すときは INTEGERINTTEXTVARCHAR(N)TEXT に置き換えるだけで、CREATE TABLE の構造はそのままにできます。

書籍を表す book_record テーブルを作ってみましょう。(正しく実行できれば解説が表示されます)

① 既存の book_record を消すため、DROP TABLE IF EXISTS book_record; を 1 行目に書いてください。

② 続けて CREATE TABLE book_record (...) を書き、列を id INTEGERtitle TEXTprice INTEGER の 3 つにしてください。

③ 確認のため、最後に SELECT name FROM sqlite_master WHERE type='table'; を書き、book_record が一覧に出ることを確かめてください。

SQL エディタ

クエリを実行してください

PRIMARY KEY — 行を一意に識別する列

主キー(PRIMARY KEY、行を一意に識別するための列)は、テーブル内で 重複しない かつ NULL を許さない 値だけが入る列です。社員番号やユーザー ID のように「他と被らず必ず存在する」列を主キーにします。

主キーがあると、特定の 1 行を確実に取得できます。原則として、各テーブルに必ず 1 つ主キーを作成しましょう。

PRIMARY KEY の 3 つの性質
性質意味違反 / 効果一意性既存の値と重複しない✗ UNIQUE 制約違反必須NULL を入れられない✗ NOT NULL 制約違反自動採番INTEGER PRIMARY KEY 限定INSERT 省略時に空き整数を自動付与
主キーは「重複しない」「NULL を許さない」「INTEGER PRIMARY KEY なら自動採番」の 3 つの性質を持つ列。各テーブルに 1 つ設定するのが原則です。
-- PRIMARY KEY を列定義の後ろに付ける
CREATE TABLE member (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  joined_on TEXT
);

INTEGER PRIMARY KEY は自動採番になる

INTEGER PRIMARY KEY と書いた列は、INSERT 時に値を省略すると 1 から順番に自動で番号が振られます。MySQL では同じ自動採番を id INT PRIMARY KEY AUTO_INCREMENT、PostgreSQL では id SERIAL PRIMARY KEY と書きます。本講座のコンソールでは INTEGER PRIMARY KEY だけで自動採番が効きます。

値を明示して INSERT した場合はその値が入り、次の自動採番はその次の整数から再開します。

会員を表す member テーブルを、id 列を主キーとして作ってみましょう。

① 既存の member を消すため、DROP TABLE IF EXISTS member; を書いてください。

CREATE TABLE member (...) を書き、id INTEGER PRIMARY KEYname TEXT NOT NULLjoined_on TEXT の 3 列にしてください。

INSERT INTO member (name, joined_on) VALUES ('Frank', '2026-04-01'), ('Grace', '2026-04-02'); を書き、id を指定せずに 2 行入れてください。

④ 最後に SELECT * FROM member; を書いて、id に自動で番号が振られていることを確認してください。

SQL エディタ

クエリを実行してください

制約違反を体験する — NOT NULL の働き

わざと違反してみて NOT NULLPRIMARY KEY といった 制約(constraint = 列に入る値のルール)を確認しましょう。NOT NULLその列に NULL を入れさせない ルールで、必須項目(名前・メールアドレスなど)に付けておくと、値が抜けた不完全な行の混入を未然に防げます。

冒頭で作成した user テーブルは name TEXT NOT NULL で定義されています。name 列に NULL を入れようとすると、DB はその INSERT を拒否してエラーを返します。

NOT NULL 制約の動き
INSERT する nameNOT NULL の評価結果'Alice'OK(値あり)○ 追加成功''(空文字)OK(空文字 ≠ NULL)○ 追加成功NULL違反(NULL 不可)✗ NOT NULLconstraint failed
NOT NULL の列に NULL を入れる INSERT は弾かれてエラー。空文字('')は NULL とは別物として扱われるので、空文字での INSERT は通る点に注意します。

user テーブルの name 列は NOT NULL 制約付きで定義されています。わざと NULL を入れて 制約違反のエラーを観察します。

① コンソールに用意されている INSERT INTO user (...) VALUES (10, NULL, 30, 'Tokyo'); を実行してください(name 列に NULL を入れようとしているので、NOT NULL constraint failed: user.name のようなエラーが返るはずです)。

(この演習は エラーが返れば正解 です — 制約はこのように、不正なデータの混入を未然に防ぐ役割を担っています)

-- 実践 3 で実行する INSERT (NOT NULL 制約違反を起こす)
INSERT INTO user (id, name, age, city)
  VALUES (10, NULL, 30, 'Tokyo');

SQL エディタ

クエリを実行してください

テーブルの確認と削除

テーブルを作ったあとは、どんな表があるかその表がどんな列を持っているか を確認したくなります。本講座のコンソールでは次の 2 つで確認します。

- テーブル一覧: SELECT name FROM sqlite_master WHERE type='table';

- 列定義の確認: PRAGMA table_info(表名);

MySQL では SHOW TABLES;DESCRIBE 表名;、Oracle では SELECT table_name FROM user_tables; のように、それぞれ専用の書き方があります。DROP TABLE でテーブルごと消すのは、どの DB でも共通の構文です。

-- ① テーブル一覧を表示
SELECT name FROM sqlite_master WHERE type='table';

-- ② user テーブルの列定義を表示
PRAGMA table_info(user);

-- ③ テーブルを消す
DROP TABLE IF EXISTS book_record;

記事冒頭で用意されている user テーブルの中身を覗いてから、不要になったテーブルを削除する書き方も試してみましょう。

PRAGMA table_info(user); を書き、user テーブルの列定義を表示してください。

② どの列に主キー(pk)が立っているかを結果の pk 列で確認してください。

③ 実践 1 で作成した book_recordDROP TABLE IF EXISTS book_record; で削除してください。

④ 最後に SELECT name FROM sqlite_master WHERE type='table'; を実行し、book_record が一覧から消えていることを確認してください。

SQL エディタ

クエリを実行してください

ALTER TABLE — 既存テーブルの定義変更

運用が始まったあとで「列を 1 つ足したい」「テーブル名を変えたい」となったら ALTER TABLE を使います。本講座で扱う主な操作は次の 4 つで、どれも MySQL / PostgreSQL でもほぼ同じ構文で動きます。

操作構文用途
テーブル名を変えるALTER TABLE 旧名 RENAME TO 新名;表全体の改名
列を追加するALTER TABLE 表名 ADD COLUMN 列名 型;新しい属性を増やす
列を削除するALTER TABLE 表名 DROP COLUMN 列名;不要になった属性を消す
列名を変えるALTER TABLE 表名 RENAME COLUMN 旧名 TO 新名;列の改名
ALTER TABLE の 4 つの操作
RENAME TO表名を変えるADD COLUMN列を追加DROP COLUMN列を削除RENAME COLUMN列名を変える
テーブル名・列の追加・列の削除・列名変更を覚えておけば、実務で触るほぼすべての定義変更に対応できます。

MySQL の MODIFY / CHANGE COLUMN / AFTER

MySQL では ALTER TABLE 表名 MODIFY 列 型;列の型 を、CHANGE COLUMN 旧名 新名 型;列名と型を同時にDROP PRIMARY KEY;主キー を変更できます。

-- 表全体の改名
ALTER TABLE user RENAME TO user_record;

-- 列の追加(末尾に email 列が増える)
ALTER TABLE user_record ADD COLUMN email TEXT;

-- 列名の変更
ALTER TABLE user_record RENAME COLUMN city TO area;

-- 列の削除
ALTER TABLE user_record DROP COLUMN email;

user テーブルに ALTER TABLE の 3 種の操作(追加・改名・削除)をまとめてかけてみましょう(この記事の最後の演習です)。

ALTER TABLE user ADD COLUMN email TEXT;email 列を追加してください。

ALTER TABLE user RENAME COLUMN city TO area;city 列を area に改名してください。

ALTER TABLE user DROP COLUMN email; で、追加した email 列を削除してください。

④ 最後に PRAGMA table_info(user); を実行し、area への改名が反映され、追加した email が削除済みになっていることを確認してください。

SQL エディタ

クエリを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1次のうち主キー(PRIMARY KEY)の説明として正しいものはどれですか。

Q2本講座のコンソールで user テーブルの列定義を確認したいとき、最も適切な書き方はどれですか。

Q3本講座のコンソールで ALTER TABLE を使うときの挙動として正しいものはどれですか。