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

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句を組み合わせれば特定の条件に合うレコードだけを抽出してコピーすることも可能なので、データ移行やバックアップ処理など、さまざまな場面で活用できます。ぜひ実際の開発でも試してみてください。

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

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec