MySQLでSELECT結果をそのままINSERTする方法【実例付きで解説】
MySQLのSELECT結果を別テーブルに挿入できるのか?
MySQLでは、VALUES句を使わずに、SELECT文の結果をそのまま別のテーブルへ挿入することができます。これは「INSERT ... SELECT文」と呼ばれる構文で、テーブル間でのデータ移行やコピーに非常に便利な機能です。
本記事では、実際に2つのテーブルを作成し、一方のテーブルのレコードをもう一方へ挿入する手順を、具体的なSQL文とともに解説していきます。
手順1:1つ目のテーブル(挿入先)を作成する
まずはデータの挿入先となるテーブル「FirstTableDemo」を作成します。作成用のクエリは以下のとおりです。
mysql> create table FirstTableDemo -> ( -> StudentId int, -> StudentName varchar(100) -> ); Query OK, 0 rows affected (0.41 sec)
学生ID(StudentId)と学生名(StudentName)を持つシンプルなテーブルです。
手順2:2つ目のテーブル(コピー元)を作成する
次に、データのコピー元となるテーブル「SecondTableDemo」を作成します。
mysql> create table SecondTableDemo -> ( -> Id int, -> Name varchar(100) -> ); Query OK, 0 rows affected (0.47 sec)
手順3:2つ目のテーブルにレコードを挿入する
通常のINSERT文を使って、2つ目のテーブルにサンプルデータを登録します。
mysql> insert into SecondTableDemo values(1,'John'); Query OK, 1 row affected (0.14 sec) mysql> insert into SecondTableDemo values(2,'Sam'); Query OK, 1 row affected (0.27 sec)
これで2件のレコードが登録されました。SELECT文で内容を確認してみましょう。
mysql> select *from SecondTableDemo;
実行結果は以下のとおりです。
+------+------+ | Id | Name | +------+------+ | 1 | John | | 2 | Sam | +------+------+ 2 rows in set (0.00 sec)
手順4:INSERT ... SELECT文で全レコードを挿入する
いよいよ本題です。INSERT ... SELECT文を使えば、SELECT文で取得した結果セットをそのまま別テーブルに流し込めます。さらにWHERE句とNOT INを組み合わせることで、既に存在するレコードとの重複を避けて挿入することも可能です。
mysql> insert into FirstTableDemo(StudentId,StudentName) -> select Id,Name from SecondTableDemo as tbl1 -> where tbl1.Id not in (select StudentId from FirstTableDemo); Query OK, 2 rows affected (0.57 sec) Records: 2 Duplicates: 0 Warnings: 0
このクエリのポイントは以下の3点です。
- カラム名が異なる場合でも、「INSERT先のカラム」と「SELECTするカラム」を明示的に指定すれば問題なく挿入できる
- サブクエリで既存のStudentIdを取得し、重複データの挿入を防止している
- 実行結果には挿入されたレコード数(Records: 2)が表示される
手順5:挿入結果を確認する
最後に、SELECT文で1つ目のテーブルの内容を確認して、正しく挿入されたかクロスチェックしましょう。
mysql> select *from FirstTableDemo;
実行結果は以下のとおりです。
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Sam | +-----------+-------------+ 2 rows in set (0.00 sec)
まとめ
MySQLでは、INSERT ... SELECT文を使うことで、SELECT文の結果を直接別のテーブルに挿入できます。カラム名が異なるテーブル間でも対応可能で、NOT INなどの条件を組み合わせれば重複チェックも同時に行えます。大量データのコピーやテーブル間のデータ移行を行う際にぜひ活用してください。
-
SELECTでテーブル全体を返すMySQLストアドプロシージャの作成方法
MySQLでは、ストアドプロシージャ内でSELECT文を実行することで、引数で渡した条件に一致するレコード(この例ではテーブル全体)を結果として返すことができます。ここでは、テーブルの作成からプロシージャの呼び出しまで、手順を追って解説します。 1. サンプルテーブルの作成 まず、テーブルを作成します。 mysql> create table DemoTable1971 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, &n
-
MySQLでテーブルAとBを比較し、Bに存在しないデータをテーブルCに挿入する方法
MySQL:テーブルAとBを比較し、Bに存在しないデータをCへ挿入する方法テーブルAのデータとテーブルBを比較し、Bに存在しないレコードだけをテーブルCに挿入したい場合は、LEFT JOIN(左外部結合)を使うのが最もシンプルで確実な方法です。ここでは、3つのテーブル(demo20=テーブルA、demo21=テーブルB、demo22=テーブルC)を使って、具体的な手順を順番に解説します。ステップ1:テーブルA(demo20)を作成するまず、比較元となる最初のテーブルを作成します。mysql> create table demo20 −> ( −> id