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

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

この記事は、基礎から複雑なSQL,SQLチューニングまでSQLの実践的なスキルを1からマスターする「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 行分
idname, priceVALUES の ()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 の正しい書き方はどれですか。