Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLにおいてSELECTINSERTといったステートメントはよく使われるものですが、この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度見直し、自分のものとしていきましょう!

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。