のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

MySQL INNER_JOIN と OUTER_JOIN

Sponsored Links

皆さんこんにちは
お元気ですか。私は実家に帰っております。

本日はMySQLでJOINを行います。JOINとはテーブルを結合する操作ですが、結合方法には様々な形式がございます。
今回2つのテーブルを用意しました。customerテーブルとcountryテーブルです。

mysql> SELECT * FROM customer;
+----+---------------+------------+
| id | name          | country_id |
+----+---------------+------------+
|  1 | yamada taro   |          1 |
|  2 | yamada hanako |          2 |
|  3 | yamada jiro   |          2 |
|  4 | yamada saburo |          4 |
|  5 | yamada shiro  |       NULL |
+----+---------------+------------+

mysql> SELECT * FROM country;
+------------+---------------+
| country_id | country_name  |
+------------+---------------+
|          1 | Japan         |
|          2 | China         |
|          3 | United States |
|          4 | India         |
+------------+---------------+

内部結合

どちらにも存在するレコードを取得します。
記載方法の一般化ですが、SELECT * FROM [table名] INNER JOIN [結合したいtable名] ON [条件]

mysql> SELECT * FROM customer INNER JOIN country ON customer.country_id = country.country_id;
+----+---------------+------------+------------+--------------+
| id | name          | country_id | country_id | country_name |
+----+---------------+------------+------------+--------------+
|  1 | yamada taro   |          1 |          1 | Japan        |
|  2 | yamada hanako |          2 |          2 | China        |
|  3 | yamada jiro   |          2 |          2 | China        |
|  4 | yamada saburo |          4 |          4 | India        |
+----+---------------+------------+------------+--------------+

右外部結合

中心に結合します。
右側にあるものは全て左に結合し、ないものについてはNULLと結合します。

一般化:SELECT * FROM [table名] RIGHT OUTER JOIN [結合したいtable名] ON [条件]

mysql> SELECT * FROM customer RIGHT OUTER JOIN country ON customer.country_id = country.country_id;
+------+---------------+------------+------------+---------------+
| id   | name          | country_id | country_id | country_name  |
+------+---------------+------------+------------+---------------+
|    1 | yamada taro   |          1 |          1 | Japan         |
|    2 | yamada hanako |          2 |          2 | China         |
|    3 | yamada jiro   |          2 |          2 | China         |
|    4 | yamada saburo |          4 |          4 | India         |
| NULL | NULL          |       NULL |          3 | United States |
+------+---------------+------------+------------+---------------+
5 rows in set (0.00 sec)

左外部結合

先程とは逆に左側に記載したテーブルを基準に結合する。

一般化:SELECT * FROM [table名] LEFT OUTER JOIN [結合したいtable名] ON [条件]

mysql> SELECT * FROM customer LEFT OUTER JOIN country ON customer.country_id = country.country_id;
+----+---------------+------------+------------+--------------+
| id | name          | country_id | country_id | country_name |
+----+---------------+------------+------------+--------------+
|  1 | yamada taro   |          1 |          1 | Japan        |
|  2 | yamada hanako |          2 |          2 | China        |
|  3 | yamada jiro   |          2 |          2 | China        |
|  4 | yamada saburo |          4 |          4 | India        |
|  5 | yamada shiro  |       NULL |       NULL | NULL         |
+----+---------------+------------+------------+--------------+
4 rows in set (0.00 sec)