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

MySQLの1つのクエリで2つのSELECT文を使い、テーブル間で値を挿入する方法

はじめに

MySQLでは、サブクエリ(SUBQUERY)を活用することで、1つのINSERT文の中に2つのSELECT文を組み込み、最初のテーブルから別のテーブルへ値を挿入することができます。通常、複数回のクエリ実行が必要な処理も、サブクエリを使えば単一のクエリで完結できるため、コードがシンプルになり、パフォーマンス面でもメリットがあります。

この記事では、実際にサンプルテーブルを作成し、2つのSELECT文を含む1つのMySQLクエリで、テーブルから別のテーブルへ値を挿入する手順を解説します。

手順1:最初のテーブルを作成する

まず、データのコピー元となる「DemoTable1」を作成します。

mysql> create table DemoTable1
(
   Name varchar(100),
   Score int
);
Query OK, 0 rows affected (1.30 sec)

手順2:レコードを挿入する

INSERTコマンドを使って、DemoTable1にいくつかのレコードを追加します。

mysql> insert into DemoTable1 values('Chris',45);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1 values('Bob',78);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1 values('David',98);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1 values('Carol',89);
Query OK, 1 row affected (0.15 sec)

手順3:テーブルの内容を確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable1;

このクエリを実行すると、次のような出力が得られます。

+-------+-------+
| Name  | Score |
+-------+-------+
| Chris |    45 |
| Bob   |    78 |
| David |    98 |
| Carol |    89 |
+-------+-------+
4 rows in set (0.00 sec)

手順4:2番目のテーブルを作成する

続いて、データのコピー先となる「DemoTable2」を作成します。カラム名は元のテーブルと異なる名前にしていますが、データ型は対応するように設計します。

mysql> create table DemoTable2
(
   StudentName varchar(100),
   StudentScore int
);
Query OK, 0 rows affected (0.58 sec)

手順5:2つのSELECT文を使ったサブクエリで値を挿入する

ここが本題のポイントです。以下のクエリでは、VALUES句の中に2つのSELECT文(サブクエリ)を記述し、1つのINSERT文だけでDemoTable1の値をDemoTable2へ挿入しています。

  • 1つ目のサブクエリ:select Name from DemoTable1 where Score=98 — スコアが98のレコードから名前を取得します。
  • 2つ目のサブクエリ:select Score from DemoTable1 where Name='David' — 名前がDavidのレコードからスコアを取得します。
mysql> insert into DemoTable2(StudentName,StudentScore) values((select Name from DemoTable1 where Score=98),(select Score from DemoTable1 where Name='David'));
Query OK, 1 row affected (0.30 sec)

実行結果の確認

DemoTable2の内容をSELECT文で確認しましょう。

mysql> select *from DemoTable2;
+-------------+--------------+
| StudentName | StudentScore |
+-------------+--------------+
| David       |          98 |
+-------------+--------------+
1 row in set (0.00 sec)

このように、スコア98に該当する「David」という名前と、Davidのスコアである「98」が、それぞれ別のSELECT文から取得され、DemoTable2に正しく挿入されていることがわかります。

まとめ

サブクエリを使えば、INSERT文のVALUES句の中に複数のSELECT文を組み込むことができ、1つのMySQLクエリだけでテーブル間のデータ転送が可能になります。条件を指定して特定の値だけを抜き出したい場合などに、非常に便利なテクニックなので、ぜひ活用してみてください。

  1. MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)

    MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab

  2. MySQLのINSERT INTO SELECT文で別のテーブルの値を挿入する方法

    あるテーブルの値を基に別のテーブルへデータを挿入したい場合は、INSERT INTO SELECT文を使用します。この構文では、SELECT文で抽出した結果セットをそのまま対象テーブルへ流し込めるため、テーブル間のデータ移行やコピーにもっとも効率的な方法の一つです。 以下の手順で、実際の動作を順番に確認していきましょう。 手順1:元となるテーブルを作成する まず、データのコピー元となるテーブル「demo82」を作成します。 mysql> create table demo82     -> (