【SQL】JOINで複数テーブル結合!初心者でも分かる解説・体験
SQLのJOINという命令について聞いたことはあるでしょうか。この命令は、複数テーブルの結合をおこないたいときに活用できます。今回の記事では、SQLのJOINを使用して複数テーブルを結合させる方法について、わかりやすい解説とハンズオンでマスターしていきましょう。
SQLのJOINとは?
まずはSQLのJOINとは一体どのような命令なのかについて理解を進めていきましょう。先述の通り、SQLのJOINは複数のテーブルを結合させる際に利用できる命令です。言葉だけではイメージしづらいかもしれませんので、以下に例を見てみましょう。
例
前提として、以下のようなテーブルがあるとします。
catsテーブル
mysql> select * from cats; +------+----------+ | name | favorite | +------+----------+ | tama | 1 | | kuro | 2 | | maro | 3 | +------+----------+ 3 rows in set (0.00 sec)
favoritesテーブル
mysql> select * from favorites; +----+-----------+ | id | hobby | +----+-----------+ | 1 | 散歩 | | 2 | 食事 | | 3 | 毛繕い | +----+-----------+ 3 rows in set (0.00 sec)
「catsテーブル」には、nameカラムと「favoritesテーブル」のidカラムと対応するfavoriteというカラムがあります。また「favoritesテーブル」には、idとhobbyカラムがあります。「catsテーブル」のidカラムに対応する形で「favoritesテーブル」のhobbyカラムを結合させましょう。
以下がJOINを使用したステートメントです。
mysql> SELECT * FROM cats INNER JOIN favorites ON cats.favorite = favorites.id;
以下が、上記ステートメントの出力結果です。
+------+----------+----+-----------+ | name | favorite | id | hobby | +------+----------+----+-----------+ | tama | 1 | 1 | 散歩 | | kuro | 2 | 2 | 食事 | | maro | 3 | 3 | 毛繕い | +------+----------+----+-----------+ 3 rows in set (0.00 sec)
出力結果を見ても分かる通り、「catsテーブル」のidカラムに対応する形で「favoritesテーブル」のhobbyカラムを結合させることができました。
SQL JOINの構造
上記の例で、JOINの役割がなんとなく理解できたでしょう。ここで先ほどの(INNER)JOINの構造を見てみましょう。
mysql> SELECT * FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.テーブル1の対応カラム = テーブル2.テーブル2の対応カラム;
JOINで複数テーブル結合ハンズオン!
さて、ここまでSQLにおけるJOINの使い方について簡単に解説をしてきました。次にSQLのJOINを使ったハンズオンに挑戦していきましょう。
ちなみに今回は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を使用する準備は完了しました。
テーブルの作成
まずはJOINのハンズオンに使用するテーブルを2つ作成していきましょう。
mysql> CREATE TABLE staffs (name VARCHAR(20), department_id INT); mysql> CREATE TABLE departments (ID INT, department_name VARCHAR(20));
以下のようなテーブルが完成しました。
staffsテーブル
mysql> DESC staffs; +---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | department_id | int(11) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
departmentsテーブル
mysql> DESC departments; +-----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+-------------+------+-----+---------+-------+ | ID | int(11) | YES | | NULL | | | department_name | varchar(20) | YES | | NULL | | +-----------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
レコードの挿入
先ほど作成した2つのテーブルにレコードを挿入していきましょう。
mysql> INSERT INTO staffs VALUES("田中", 3),("山田", 1),("杉下", 2),("太田", 3),("久保田", 2),("冨田",1); mysql> INSERT INTO departments VALUES(1, "マーケティング"),(2, "広報"),(3, "総務");
これで、それぞれのテーブルは以下の状態になりました。
staffsテーブル
mysql> SELECT * FROM staffs; +-----------+---------------+ | name | department_id | +-----------+---------------+ | 田中 | 3 | | 山田 | 1 | | 杉下 | 2 | | 太田 | 3 | | 久保田 | 2 | | 冨田 | 1 | +-----------+---------------+ 6 rows in set (0.00 sec)
departmentsテーブル
mysql> SELECT * FROM departments; +------+-----------------------+ | ID | department_name | +------+-----------------------+ | 1 | マーケティング | | 2 | 広報 | | 3 | 総務 | +------+-----------------------+ 3 rows in set (0.00 sec)
JOINで2つのテーブルを結合
いよいよJOINで2つのテーブルを結合させていきましょう。
以下のようにステートメントを出します。
mysql> SELECT * FROM staffs INNER JOIN departments ON staffs.department_id = departments.id;
以下が出力結果です。
+-----------+---------------+------+-----------------------+ | name | department_id | ID | department_name | +-----------+---------------+------+-----------------------+ | 田中 | 3 | 3 | 総務 | | 山田 | 1 | 1 | マーケティング | | 杉下 | 2 | 2 | 広報 | | 太田 | 3 | 3 | 総務 | | 久保田 | 2 | 2 | 広報 | | 冨田 | 1 | 1 | マーケティング | +-----------+---------------+------+-----------------------+ 6 rows in set (0.00 sec)
上記のように、department_idに対応している「departments」テーブルのカラムが、もう1つの「staffs」テーブルへ結合しました。
まとめ
今回の記事では、SQLのJOINを使用して複数テーブルを結合させる方法についてわかりやすい解説とハンズオンでマスターすることを目指してきました。SQLのJOINの使用方法にはクセがありましたが、その時々で適した使い方ができるようになることが理想です。ぜひ、本記事のハンズオンなどをもう1度おこなってみた上で自由自在にJOINを扱えるようになりましょう!