本文へスキップ
BecomeCoder

SQL データ操作 (DML)コース · 第4章 データを変える · レッスン18

複数行INSERT と INSERT ... SELECT ― まとめて追加する

ブラウザで完結

導入

前の3レッスンで、1行ずつデータを追加・更新・削除する基本を身につけました。でも実務では「10件まとめて登録したい」「別の表の検索結果を、そのまま新しい表に流し込みたい」という場面が頻繁にあります。INSERT を1件ずつ何度も書くのは面倒だし遅い。ここでは、まとめて挿入する2つの書き方を覚えます。

説明

複数行 INSERT ― VALUES をカンマで並べる。1つの INSERT 文に、行のかたまり (...) をカンマ区切りで並べるだけです。1件ずつ3回書くより短く、DBへの往復も1回で済むので速くなります。

INSERT INTO categories (id, name) VALUES
  (10, '家電'),
  (11, '書籍'),
  (12, '食品');

INSERT … SELECT ― 検索結果をそのまま挿入するVALUES の代わりに SELECT を書くと、その問い合わせ結果の各行がそのまま挿入されます。「既存データを加工して別テーブルへ移す」「集計結果を保存する」といった処理の定番です。

flowchart LR
    S["SELECT で取り出した行<br/>(何行でも)"] -->|"INSERT INTO ... SELECT"| T["対象テーブルへ<br/>まとめて挿入"]

たとえば「在庫が5個以下の商品」を、控え用の別テーブル low_stock にコピーするイメージです(まず器を作ってから流し込みます)。

CREATE TABLE low_stock (id INTEGER, name TEXT, stock INTEGER);

INSERT INTO low_stock (id, name, stock)
SELECT id, name, stock FROM products WHERE stock <= 5;

SELECT * FROM low_stock;

SELECT が返した行数ぶんだけ、low_stock に行が増えます。列の並び順が挿入先とそろっていることだけ注意しましょう。

やってみよう

初期表示の複数行 INSERT(家電・書籍・食品の3カテゴリを一度に追加)を実行し、続く SELECT * FROM categories; で3件まとめて増えていることを確認しましょう。次に INSERT ... SELECT の例も試して、検索結果がそのまま別テーブルに入る様子を見てください。

演習

users テーブルに、2人の会員を1つの INSERT 文でまとめて追加してください。1人目は (10, '中村', 29, '仙台')、2人目は (11, '小林', 41, '神戸') です(列は id, name, age, city)。

ヒント1を見る

VALUES のあとに (...) をカンマで2つ並べます。

ヒント2を見る

INSERT INTO users (id, name, age, city) VALUES (10, '中村', 29, '仙台'), (11, '小林', 41, '神戸');

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。