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

INSERT — テーブルにデータを追加する

SQL の INSERT 文を基礎から解説します。列名指定の基本形、列名省略形、複数行を一度に追加する書き方の 3 パターンを、それぞれ別のテーブルで図解しながらブラウザで実行して学べます。

INSERT — テーブルに行を追加する

テーブルに新しい行を追加するには INSERT 文を使います。SELECT が「データを 読む」操作だったのに対し、INSERT は「データを 挿入する」もっとも基本の操作です。ユーザー登録・購入記録・ログ書き込みなど、アプリが何かを「保存する」場面のほとんどが INSERT で行います。

INSERT 文の構文要素
INSERT INTO 表名(列リスト)VALUES (値リスト);対象の表入れる列(省略可)値リスト(列順に)
INSERT 文は『INSERT INTO 表名』『(列リスト)』『VALUES (値リスト);』の 3 ブロックを順に並べた形。列リストは省略可で、その場合は VALUES の値を全列分・列定義の順序通りに並べます。

列名を指定して値を入れる(基本形)

もっとも一般的な書き方は、入れたい列名と値の両方を明示する 形です。INSERT INTO 表名 (列, 列, ...) VALUES (値, 値, ...); のように、テーブル名のあとに丸括弧で列リストを並べ、VALUES のあとに同じ順序・同じ個数の値を並べます。

この書き方では 列リストに書かなかった列は自動的に NULL(または列の DEFAULT) になります。INTEGER PRIMARY KEY 列を省略した場合は自動採番が働き、空いている整数が振られます。

INSERT 文の構造(基本形)
INSERT INTO(列リスト)VALUES (値リスト)テーブル名book入れる列(title, price)値リスト('SQL入門', 1980)対象の表列を指定値を並べる
INSERT INTO は「どの表に入れるか」、丸括弧の列リストは「どの列に値を入れるか」、VALUES の () の中は「列リストと同じ順序の値」を指定します。3 つの位置と役割をまず押さえます。
-- book テーブルに 1 行追加(title と price だけ指定)
INSERT INTO book (title, price) VALUES ('SQL入門', 1980);

-- 結果を確認
SELECT * FROM book;

省略した列はどうなる?

列リストに書かなかった列は、列の DEFAULT 値(指定がなければ NULL)が入ります。INTEGER PRIMARY KEY 列を省略した場合は 自動採番 が働き、空いている整数が振られます(MySQL の AUTO_INCREMENT 相当)。

書籍データベースに新しい本を 1 冊登録する、という要件を想定します。(正しく実行できれば解説が表示されます)

book テーブルに 1 行 INSERT してください。

② 列は titleprice の 2 つだけ指定します。値は title='実践SQL'price=2480 です。

③ 最後に SELECT * FROM book; を実行し、id が自動採番され、published_onNULL になっていることを確認してください。

SQL エディタ

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

列名を省略して全列を入れる

もう一つの書き方は、列リストを書かずに全列の値だけを順番に並べる 短縮形です。INSERT INTO 表名 VALUES (値, 値, ...); のように、表名のすぐあとに VALUES が来ます。

短く書ける代わりに、テーブル定義の列順を覚えていないと書けません。また、後から ALTER TABLE で列が増えると、この形の INSERT は 値の個数が合わず壊れる ため、一時データの投入や使い捨てスクリプトのような限定的な場面で使う書き方になります。

列名指定形 と 列名省略形 の対比
必要な列だけ書く / 列追加に強い全列を順序通り / 列追加で値が合わなくなる列名指定形(推奨)INSERT INTO task (title, done) VALUES ('掃除', 0);列名省略形(短縮)INSERT INTO task VALUES ('掃除', 0);
列名指定形は「入れる列だけ」明示、列名省略形は「全列を順序通り」。後者は短くなるかわりに、列追加に弱い書き方です。
-- task テーブルに 1 行追加(列リストを省略する短縮形)
INSERT INTO task VALUES ('掃除', 0);

-- 結果を確認
SELECT * FROM task;

列名省略形は ALTER TABLE で壊れる

INSERT INTO task VALUES ('掃除', 0); は今は 2 列のテーブルなので動きますが、後から ALTER TABLE task ADD COLUMN due_on TEXT; で列を追加すると、全列分の値が 3 つ必要 になり、この INSERT は値の数が合わずエラーで壊れます。

本番のアプリやスクリプトでは 列名指定形(基本形) を選んでおくと、テーブル定義が変わっても INSERT を書き直さずに済みます。短縮形は「テーブル構造が変わらない一時データ」「使い捨てスクリプト」のような限定的な場面に留めるのが安全です。

todo アプリで新しいタスクを 1 件登録する、という要件を想定します。

task テーブルに 列名を省略して 1 行 INSERT してください。

task の列順は titledone です。値は title='買い物'done=0 の順番で入れます。

③ 最後に SELECT * FROM task; を実行し、入れた行が登録されていることを確認してください。

SQL エディタ

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

複数行を一度に追加する

INSERT 文 1 つで 複数の行をまとめて 入れることもできます。VALUES のあとに (値, 値, ...)カンマ区切りで複数並べる だけで、各 () が 1 行ずつになります。

複数行を 1 つの INSERT で入れる利点は 2 つあります。1 つは 記述量が短くなる こと、もう 1 つは DB への往復が 1 回で済む ことで、行ごとに INSERT を発行するよりも処理が速くなります。CSV やログを一括で取り込むバッチ処理ではこの形を使うのが基本です。

-- product テーブルに 3 行を一度に追加
INSERT INTO product (name, price) VALUES
  ('りんご', 150),
  ('バナナ', 100),
  ('オレンジ', 200);

-- 結果を確認
SELECT * FROM product;
複数行 INSERT — VALUES の () が 1 行分
idnamepriceVALUES の ()1(自動)りんご150('りんご', 150)2(自動)バナナ100('バナナ', 100)3(自動)オレンジ200('オレンジ', 200)1 行目2 行目3 行目
VALUES のあとに () を 1 つ書けば 1 行追加、() をカンマ区切りで N 個並べれば N 行追加されます。各 () の中身は列リストと同じ順序です。

EC サイトの初期商品データを 3 件まとめて登録する、という要件を想定します。

product テーブルに 3 行を一度に INSERT してください。

② 列は nameprice の 2 つを指定します。値は順に ('鉛筆', 80) / ('消しゴム', 120) / ('ノート', 250) の 3 行です。

③ 最後に SELECT * FROM product; を実行し、id が自動採番された 3 行が並ぶことを確認してください。

SQL エディタ

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

列名省略形が壊れる場面 — ALTER TABLE で列が増えた時

前の章の callout で「列名省略形は ALTER TABLE で壊れる」と書きました。実際に壊れる様子を 1 度だけ体験しておくと、本番で列名省略形を使うべきか迷ったときに判断しやすくなります。

本記事の最後の演習として、スクラッチ用テーブル `task_v2` を作って ALTER TABLE で列を増やし、その前後で同じ列名省略形 INSERT を試します。前は通っていた INSERT が、列が増えた途端に 「値の数が合わない」エラー になることが体感できます。

スクラッチ用 task_v2 テーブルを作って、列名省略形 INSERT が ALTER TABLE 後に壊れる様子を観察します。

DROP TABLE IF EXISTS task_v2; で既存の同名テーブルを消し、続けて CREATE TABLE task_v2 (title TEXT, done INTEGER); で 2 列のテーブルを作成してください。

INSERT INTO task_v2 VALUES ('買い物', 0); を実行 — この時点では 2 列なので成功します(列名省略形が通る)。

ALTER TABLE task_v2 ADD COLUMN due_on TEXT; を実行して 3 列目を追加してください。

④ もう一度 INSERT INTO task_v2 VALUES ('読書', 0); を実行してください。今度は 値が 2 つしかないのに列が 3 つ あるので、エラーで拒否されるはずです。

(この演習は エラーが返れば正解 です)

SQL エディタ

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

理解度チェック

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

Q1INSERT INTO book (title, price) VALUES ('SQL入門', 1980); を実行した時、列リストに含めなかった id 列(INTEGER PRIMARY KEY)の値はどうなりますか。

Q2次のうち、列名省略形 INSERT INTO 表名 VALUES (...) の説明として正しいものはどれですか。

Q3次のうち、複数行 INSERT の正しい書き方はどれですか。