MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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構文を活用すれば、複雑な処理を書かなくても柔軟なデータ挿入が実現できます。日々の開発業務でも頻繁に使うテクニックなので、ぜひマスターしておきましょう。

  1. 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)

  2. 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)