MySQLでクエリ結果からテーブルにデータを挿入する方法
INSERT INTO ~ SELECT 構文とは
MySQLでは、INSERT INTO ~ SELECT構文を使うことで、別テーブルのクエリ結果をそのまま既存のテーブルへ挿入できます。大量のデータを手作業で入力する必要がなく、テーブル間でのデータ移行や集計結果の保存などに非常に便利な構文です。
基本の書式は以下のとおりです。
INSERT yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,..........N) SELECT yourColumnName1,yourColumnName2,yourColumnName3,..........N FROM yourAnotherTableName;
それでは、実際にサンプルを使いながら動作を確認していきましょう。
ステップ1:元となるテーブルを作成する
まず、データのコピー元になる最初のテーブル「PopulateTableDemo」を作成します。以下のクエリを実行してください。
mysql> create table PopulateTableDemo -> ( -> Id int NOT NULL AUTO_INCREMENT, -> Name varchar(20), -> Amount int, -> ArrivalDateTime datetime, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (0.68 sec)
ステップ2:サンプルデータを挿入する
次に、INSERTコマンドを使ってテーブルにレコードを追加します。
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('John',456,'2018-02-4');
Query OK, 1 row affected (0.17 sec)
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('Carol',1000,'2019-10-21');
Query OK, 1 row affected (0.17 sec)
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('Sam',970,'2019-07-25');
Query OK, 1 row affected (0.14 sec)
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('Larry',1050,'2015-10-28');
Query OK, 1 row affected (0.16 sec)ステップ3:挿入したデータを確認する
SELECT文ですべてのレコードを表示して、正しく登録されているか確認しましょう。
mysql> select *from PopulateTableDemo;
実行結果は以下のとおりです。
+----+-------+--------+---------------------+ | Id | Name | Amount | ArrivalDateTime | +----+-------+--------+---------------------+ | 1 | John | 456 | 2018-02-04 00:00:00 | | 2 | Carol | 1000 | 2019-10-21 00:00:00 | | 3 | Sam | 970 | 2019-07-25 00:00:00 | | 4 | Larry | 1050 | 2015-10-28 00:00:00 | +----+-------+--------+---------------------+ 4 rows in set (0.00 sec)
ステップ4:コピー先のテーブルを作成する
続いて、データの挿入先となる2つ目のテーブル「PopulateQueryFromAnotherTable」を作成します。カラム名は元テーブルと異なる名前(UserName、Salary、DepartureDateTime)にしています。
mysql> create table PopulateQueryFromAnotherTable -> ( -> Id int NOT NULL AUTO_INCREMENT, -> UserName varchar(20), -> Salary int, -> DepartureDateTime datetime, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (1.30 sec)
ステップ5:INSERT INTO ~ SELECT でデータをコピーする
ここが本題のポイントです。次のクエリで、「PopulateTableDemo」のデータを「PopulateQueryFromAnotherTable」へ一括挿入します。
mysql> insert PopulateQueryFromAnotherTable(UserName,Salary,DepartureDateTime) -> select Name,Amount,ArrivalDateTime from PopulateTableDemo; Query OK, 4 rows affected (0.15 sec) Records: 4 Duplicates: 0 Warnings: 0
このように、SELECT句で指定したカラムの順序と、INSERT句で指定したカラムの順序が対応していれば、カラム名が異なるテーブル間でも問題なくデータをコピーできます。
ステップ6:コピー結果を確認する
最後に、2つ目のテーブルの中身をSELECT文で確認しましょう。
mysql> select *from PopulateQueryFromAnotherTable;
実行結果は以下のとおりです。
+----+----------+--------+---------------------+ | Id | UserName | Salary | DepartureDateTime | +----+----------+--------+---------------------+ | 1 | John | 456 | 2018-02-04 00:00:00 | | 2 | Carol | 1000 | 2019-10-21 00:00:00 | | 3 | Sam | 970 | 2019-07-25 00:00:00 | | 4 | Larry | 1050 | 2015-10-28 00:00:00 | +----+----------+--------+---------------------+ 4 rows in set (0.00 sec)
まとめ
このように、INSERT INTO ~ SELECT構文を使えば、別テーブルのクエリ結果を簡単に新しいテーブルへ挿入できます。WHERE句を組み合わせれば特定の条件に合うレコードだけを抽出してコピーすることも可能なので、データ移行やバックアップ処理など、さまざまな場面で活用できます。ぜひ実際の開発でも試してみてください。
-
MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法
MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec