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クエリだけでテーブル間のデータ転送が可能になります。条件を指定して特定の値だけを抜き出したい場合などに、非常に便利なテクニックなので、ぜひ活用してみてください。
-
MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)
MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab
-
MySQLのINSERT INTO SELECT文で別のテーブルの値を挿入する方法
あるテーブルの値を基に別のテーブルへデータを挿入したい場合は、INSERT INTO SELECT文を使用します。この構文では、SELECT文で抽出した結果セットをそのまま対象テーブルへ流し込めるため、テーブル間のデータ移行やコピーにもっとも効率的な方法の一つです。 以下の手順で、実際の動作を順番に確認していきましょう。 手順1:元となるテーブルを作成する まず、データのコピー元となるテーブル「demo82」を作成します。 mysql> create table demo82 -> (