SQLにおいてSELECTやINSERTといったステートメントはよく使われるものですが、この2つのステートメントを併用することによって、他テーブルにSELECT結果を移動できるということをご存知でしたか?
今回の記事ではSELECTした結果を別テーブルへINSERTする方法について、ハンズオンも交えて分かりやすく解説をしていきます。それでは早速見ていきましょう。
SELECTした結果を別テーブルへINSERTする方法
さっそくSELECTした結果を別テーブルへINSERTする方法について見ていきましょう。以下のような流れでテーブル間のデータを移動できるようになります。
まずは前提として、以下2つのテーブルがあるとしましょう。
country_populationテーブル
mysql> SELECT * FROM country_population; +-----------+------------+ | country | population | +-----------+------------+ | China | 1357946313 | | India | 1224514327 | | America | 314551246 | | Indonesia | 239870937 | | Brazil | 194946470 | | Pakistan | 173593383 | +-----------+------------+ 6 rows in set (0.00 sec)
resultテーブル
mysql> SELECT * FROM result; Empty set (0.00 sec)
country_populationテーブルには、各国の人口が数値となって入力されています。一方で、resultテーブルにはまだ何もレコードが入っていない状態です。
そこで、country_populationテーブルから「人口が10億人以下」の国だけをresultテーブルに移行させましょう。以下のようにSQLで指示を出します。
mysql> INSERT INTO result (country, population) SELECT country, population FROM country_population WHERE population < 1000000000; Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0
実際にresultテーブル全体をSELECTで出力し、結果を確かめてみましょう。
mysql> SELECT * FROM result; +-----------+------------+ | country | population | +-----------+------------+ | America | 314551246 | | Indonesia | 239870937 | | Brazil | 194946470 | | Pakistan | 173593383 | +-----------+------------+ 4 rows in set (0.00 sec)
上記の結果を見ると、country_populationテーブルから「人口が10億人以下」の国だけがresultテーブルに移行されているということが分かります。
SELECT / INSERT の構造
改めてSELECTした結果を別テーブルへINSERTする構文構造を見てみましょう。以下のようになっています。
INSERT INTO 挿入先のテーブル名 (挿入先のカラム名1, 挿入先のカラム名2, ...) SELECT 挿入元のカラム名1, 挿入元のカラム名2, ... FROM 挿入元のテーブル名 WHERE 条件;
テーブル名やカラム名が入ると複雑に見えますが、実際のところはいつも使っているシンプルなINSERTステートメントとSELECTステートメントが前後に合わさっているだけだと考えてもいいでしょう。
SELECTした結果を別テーブルへINSERTするハンズオン
いよいよ、ここまでの内容をもとにSELECTした結果を別テーブルへINSERTするハンズオンにトライしましょう。
ちなみに今回はMySQLを使用していきます。MySQLはバージョンによって動作が異なるケースもありますので、以下に今回使用したMySQLのバージョンを記しておきます。もし途中でエラーが発生した場合は、こちらも確認してみてください。
$ mysql --version mysql Ver 8.0.18 for osx10.15 on x86_64 (Homebrew)
準備
まずはMySQLを使用するための準備をしていきます。
MySQLのインストール・接続
まだMySQLをインストールしていない場合は、インストールしましょう。
$ brew install mysql
MySQLのインストールが終了したら、接続します。
$ sudo mysql -u root -p
データベースの作成
次にデータベースをMySQL上に作成し、使用するデータベースを指定しましょう。
mysql> CREATE DATABASE potepan; Query OK, 1 row affected (0.00 sec) mysql> USE potepan;
これでMySQLを使用する準備は完了しました。
テーブルの作成
それでは、実際にSELECTした結果を別テーブルへINSERTするハンズオンで使用するテーブルを作成しましょう。
mysql> CREATE TABLE vegetables(name VARCHAR(50), price INT); mysql> CREATE TABLE results(result_name VARCHAR(50), result_price INT);
これで挿入元のテーブル「vegetables」と、挿入先のテーブル「result」ができました。
レコードの挿入
先ほど作成したvegetablesテーブルにレコードを挿入していきましょう。
mysql> INSERT INTO vegetables VALUES('Apricot', 200),('Strawberry', 500),('Persimmon', 250),('Kiwi fruit', 100),('Kumquat',300),('Cherry',700),('Watermelon',500),('Pear',150); Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0
上記の結果、vegetablesテーブルは以下のような状態です。
mysql> SELECT * FROM vegetables; +------------+-------+ | name | price | +------------+-------+ | Apricot | 200 | | Strawberry | 500 | | Persimmon | 250 | | Kiwi fruit | 100 | | Kumquat | 300 | | Cherry | 700 | | Watermelon | 500 | | Pear | 150 | +------------+-------+ 8 rows in set (0.00 sec)
SELECTした結果を別テーブルへINSERT
いよいよSELECTした結果を別テーブルへINSERTしてみましょう。
以下のステートメントを入力し、priceの値が500以下のレコードのみをresultsテーブルへ挿入しましょう。
mysql> INSERT INTO results(result_name, result_price) SELECT name, price FROM vegetables WHERE price < 500; Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0
上記のステートメントを入力した結果、resultsテーブルがどうなっているか見てみましょう。
mysql> SELECT * FROM results; +-------------+--------------+ | result_name | result_price | +-------------+--------------+ | Apricot | 200 | | Persimmon | 250 | | Kiwi fruit | 100 | | Kumquat | 300 | | Pear | 150 | +-------------+--------------+ 5 rows in set (0.00 sec)
想定どおり、priceの値が500以下のレコードだけがresultsテーブルに挿入されました。
まとめ
今回の記事ではSELECTした結果を別テーブルへINSERTする方法について、ハンズオンも交えて分かりやすく解説をしていきました。2つのテーブル間でデータの共有をする際にはとても便利なテクニックですね。最初は慣れないかもしれませんが、使いこなすことでますますSQLを活用できるようになるため、ぜひ本記事をもう1度見直し、自分のものとしていきましょう!