MySQLでINSERTとSELECTを組み合わせて別テーブルからデータを挿入する方法
MySQLでは、INSERT文とSELECT文を組み合わせることで、別のテーブルから取得したデータをそのまま新しいテーブルに挿入できます。この記事では、その基本的な構文と具体的な使用例を解説します。
基本構文
INSERT、VALUES、SELECTを組み合わせるには、以下の構文を使用します。
insert into yourFirstTableName(yourColumnName1,yourColumnName2,.......N) select yourColumnName1,yourColumnName2,.......N from yourSecondTableName where yourCondition;
この構文では、2つ目のテーブル(yourSecondTableName)から条件に合致するレコードをSELECTで抽出し、1つ目のテーブル(yourFirstTableName)へ挿入します。
動作確認用のテーブルを作成する
構文を理解するために、まずレコードを受け取る側のテーブルを作成しましょう。こちらはまだレコードを持ちません。
mysql> create table CombiningInsertValuesSelect
-> (
-> EmployeeId varchar(10),
-> EmployeeName varchar(100),
-> EmployeeAge int
-> );
Query OK, 0 rows affected (6.95 sec)次に、元データとなる2つ目のテーブルを作成します。
mysql> create table getAllValues
-> (
-> Id varchar(100),
-> Name varchar(100),
-> Age int
-> );
Query OK, 0 rows affected (1.12 sec)元テーブルにレコードを挿入する
getAllValuesテーブルに、INSERTコマンドを使ってレコードを登録します。
mysql> insert into getAllValues values('EMP-1','John',26);
Query OK, 1 row affected (0.86 sec)
mysql> insert into getAllValues values('EMP-2','Carol',22);
Query OK, 1 row affected (0.36 sec)
mysql> insert into getAllValues values('EMP-3','Sam',24);
Query OK, 1 row affected (0.28 sec)
mysql> insert into getAllValues values('EMP-4','David',27);
Query OK, 1 row affected (0.25 sec)
mysql> insert into getAllValues
values('EMP-5','Bob',21);
Query OK, 1 row affected (0.75 sec)挿入したレコードを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from getAllValues;
実行結果は以下の通りです。
+-------+-------+------+ | Id | Name | Age | +-------+-------+------+ | EMP-1 | John | 26 | | EMP-2 | Carol | 22 | | EMP-3 | Sam | 24 | | EMP-4 | David | 27 | | EMP-5 | Bob | 21 | +-------+-------+------+ 5 rows in set (0.00 sec)
INSERT ... SELECTを実行する
それでは、INSERTとSELECTを組み合わせたクエリを実行します。ここでは、Idが「EMP-4」のレコードだけを抽出して、最初に作成したテーブルへ挿入します。
mysql> insert into CombiningInsertValuesSelect(EmployeeId,EmployeeName,EmployeeAge)
-> select Id,Name,Age from getAllValues where Id='EMP-4';
Query OK, 1 row affected (0.23 sec)
Records: 1 Duplicates: 0 Warnings: 0挿入結果を検証する
最後に、SELECT文でレコードが正しく挿入されたかどうかを確認します。
mysql> select *from CombiningInsertValuesSelect;
実行結果は以下の通りです。
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | EMP-4 | David | 27 | +------------+--------------+-------------+ 1 row in set (0.00 sec)
このように、WHERE句で条件を指定すれば、元テーブルから必要なレコードだけを選択的に別テーブルへコピーできます。条件を外せば全レコードの一括コピーも可能なので、テーブル間のデータ移行やバックアップ作成など、さまざまな場面で活用できる便利なテクニックです。
-
MySQLテーブルで先頭ゼロ付きの値を選択して挿入する方法
MySQLで連番に先頭ゼロ(先行ゼロ)を付けた値をテーブルに挿入したい場合は、INSERT INTO SELECT文とLPAD()関数を組み合わせることで実現できます。LPAD()は文字列を指定した長さまで左側を特定の文字で埋める関数で、これを使えば「001」「002」のような形式のIDを簡単に生成できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1967 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId varchar(20)
-
MySQLでSELECTとSHOWコマンドの結果を1つに結合する方法
はじめにMySQLでは、SELECT文やSHOWコマンドの実行結果を、ユーザー定義変数(セッション変数)を活用することで1つの結果セットにまとめることができます。この記事では、その具体的な方法をサンプルコード付きで解説します。基本的な構文複数のコマンド結果を1つに結合するには、以下のようなクエリを使用します。各変数に別名(エイリアス)を付けて出力するのがポイントです。select @任意の変数名1 as 別名1, @任意の変数名2 as 別名2, ......N;手順1:最初の変数を作成・初期化するまず、結合したい値を格納するための最初の変数を作成し、初期化します。mysql> set