MySQLでSELECT文を使ったネストされたINSERT(INSERT ... SELECT)は可能?使い方を実例付きで解説
MySQLでINSERT ... SELECTは使えるのか
はい、MySQLではINSERT INTO ... SELECT構文を使用することで、SELECT文で取得した結果をそのまま別のテーブルへ挿入できます。これにより、テーブル間のデータコピーや、条件を付けたデータ移行を1つのSQL文で簡単に実現できます。
基本構文
insert into yourTableName2(yourColumnName1,yourColumnName2,.....N) select yourColumnName1,yourColumnName2,....N from yourTableName1 where yourCondition;
この構文では、テーブル1からSELECT句で取得したデータが、そのままテーブル2へ挿入されます。WHERE句を組み合わせれば、必要なレコードだけを絞り込んで挿入することも可能です。
実際に試してみよう
1. 元となるテーブルを作成する
まず、コピー元となるサンプルテーブルを作成します。
mysql> create table DemoTable1
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(40)
);
Query OK, 0 rows affected (0.88 sec)
2. レコードを挿入する
INSERTコマンドを使って、いくつかのレコードを追加します。
mysql> insert into DemoTable1(Name) values('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1(Name) values('David');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1(Name) values('Bob');
Query OK, 1 row affected (0.12 sec)
3. データを確認する
SELECT文で登録済みのレコードを表示してみましょう。
mysql> select *from DemoTable1;
実行結果:
+----+-------+ | Id | Name | +----+-------+ | 1 | Chris | | 2 | David | | 3 | Bob | +----+-------+ 3 rows in set (0.00 sec)
4. 挿入先のテーブルを作成する
続いて、データの挿入先となる2つ目のテーブルを作成します。
mysql> create table DemoTable2
(
ClientId int,
ClientFirstName varchar(20)
);
Query OK, 0 rows affected (0.60 sec)
5. INSERT ... SELECTでネストされた挿入を実行する
ここが本題です。SELECT文の結果をそのままINSERTするクエリは以下の通りです。
mysql> insert into DemoTable2(ClientId,ClientFirstName) select Id,Name from DemoTable1 where Id !=2; Query OK, 2 rows affected (0.17 sec) Records : 2 Duplicates: 0 Warnings : 0
この例では、DemoTable1から「Idが2以外」のレコードを抽出し、その結果をそのままDemoTable2に挿入しています。
6. 挿入結果を確認する
最後に、SELECT文で挿入後のデータを確認しましょう。
mysql> select *from DemoTable2;
実行結果:
+----------+-----------------+ | ClientId | ClientFirstName | +----------+-----------------+ | 1 | Chris | | 3 | Bob | +----------+-----------------+ 2 rows in set (0.00 sec)
Id=2の「David」を除いた2件のレコードが、正しくDemoTable2へ挿入されていることがわかります。
押さえておきたいポイント
- カラムの対応:SELECT句で指定するカラムの数・順序・データ型は、INSERT先のカラムと一致(または互換性がある)必要があります。
- WHERE句による絞り込み:条件を指定すれば必要なデータだけを転送でき、不要なレコードの混入を防げます。
- 活用シーン:テーブル間のデータコピー、バックアップテーブルの作成、大量データの一括移行などに便利です。
このように、MySQLのINSERT ... SELECT構文を活用すれば、複雑な処理を書かなくても柔軟なデータ挿入が実現できます。日々の開発業務でも頻繁に使うテクニックなので、ぜひマスターしておきましょう。
-
MySQLでINSERT INTO SELECTとUNIONを組み合わせて複数行を一括挿入する方法
INSERT INTO SELECTとUNIONによる複数行の一括挿入MySQLでは、INSERT INTO ... SELECT文とUNIONを組み合わせることで、1つのSQL文で複数のレコードをまとめて挿入できます。通常、複数行の挿入にはVALUES句をカンマ区切りで並べる方法が一般的ですが、この構文を使えばSELECT文の形式で値を指定することも可能です。基本構文複数のレコードを一括挿入する場合、構文は以下のようになります。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,..N)
-
MySQLテーブルで先頭ゼロ付きの値を選択して挿入する方法
MySQLで連番に先頭ゼロ(先行ゼロ)を付けた値をテーブルに挿入したい場合は、INSERT INTO SELECT文とLPAD()関数を組み合わせることで実現できます。LPAD()は文字列を指定した長さまで左側を特定の文字で埋める関数で、これを使えば「001」「002」のような形式のIDを簡単に生成できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1967 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId varchar(20)