【MySQL】自然結合(NATURAL) - テーブル結合
MySQLの自然結合について解説します。
検証環境
自然結合
自然結合は“複数テーブルを繋げて1つの表データを作成すること”です。
内部結合や外部結合において、結合条件を指定せず、各テーブルのカラム名が同じモノ同士を基点にレコードを繋げます。
次のshopsテーブルとphonesテーブルで具体例を示します。
/* shopsテーブル */
+------+--------------+
| code | name |
+------+--------------+
| S001 | Fruits Shop |
| S002 | Food Shop |
| S003 | Dessert Shop |
+------+--------------+
/* phonesテーブル */
+------+---------------+
| code | tel |
+------+---------------+
| S001 | AAA-AAAA-AAAA |
| S001 | BBB-BBBB-BBBB |
| S002 | XXX-XXXX-XXXX |
| S002 | YYY-YYYY-YYYY |
+------+---------------+
shopsテーブルとphonesテーブルはどちらもcodeカラムを持ちます。
このテーブルを自然結合した結果は次の表です。
+------+-------------+---------------+
| code | name | tel |
+------+-------------+---------------+
| S001 | Fruits Shop | AAA-AAAA-AAAA |
| S001 | Fruits Shop | BBB-BBBB-BBBB |
| S002 | Food Shop | XXX-XXXX-XXXX |
| S002 | Food Shop | YYY-YYYY-YYYY |
+------+-------------+---------------+
自動でcodeカラムを結合条件のカラムにして、レコードが結合されます。
NATURAL INNER JOIN
MySQLで内部結合(自然結合)を実現するにはNATURAL INNER JOIN句を使用します。
基本構文
SELECT 表示カラム FROM テーブルA NATURAL INNER JOIN テーブルB
内部結合のINNER JOIN句の先頭にNATURALを記述します。
自然結合は自動で結合するカラムを判定するため、結合条件は不要です。
サンプル
mysql> SELECT * FROM shops;
+------+--------------+
| code | name |
+------+--------------+
| S001 | Fruits Shop |
| S002 | Food Shop |
| S003 | Dessert Shop |
+------+--------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM phones;
+------+---------------+
| code | tel |
+------+---------------+
| S001 | AAA-AAAA-AAAA |
| S001 | BBB-BBBB-BBBB |
| S002 | XXX-XXXX-XXXX |
| S002 | YYY-YYYY-YYYY |
+------+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM shops
___ih_hl_start
-> NATURAL INNER JOIN phones;
___ih_hl_end
+------+-------------+---------------+
| code | name | tel |
+------+-------------+---------------+
| S001 | Fruits Shop | AAA-AAAA-AAAA |
| S001 | Fruits Shop | BBB-BBBB-BBBB |
| S002 | Food Shop | XXX-XXXX-XXXX |
| S002 | Food Shop | YYY-YYYY-YYYY |
+------+-------------+---------------+
4 rows in set (0.00 sec)
23行目が内部結合(自然結合)の部分です。
shopsテーブルのcodeカラムとphonesテーブルのcodeで内部結合しています。
NATURAL LEFT JOIN
MySQLで左外部結合(自然結合)を実現するにはNATURAL LEFT JOIN句を使用します。
基本構文
SELECT 表示カラム FROM テーブルA NATURAL LEFT JOIN テーブルB
左外部結合のLEFT JOIN句の先頭にNATURALを記述します。
自然結合は自動で結合するカラムを判定するため、結合条件は不要です。
サンプル
mysql> SELECT * FROM shops;
+------+--------------+
| code | name |
+------+--------------+
| S001 | Fruits Shop |
| S002 | Food Shop |
| S003 | Dessert Shop |
+------+--------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM phones;
+------+---------------+
| code | tel |
+------+---------------+
| S001 | AAA-AAAA-AAAA |
| S001 | BBB-BBBB-BBBB |
| S002 | XXX-XXXX-XXXX |
| S002 | YYY-YYYY-YYYY |
+------+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM shops NATURAL LEFT JOIN phones;
___ih_hl_start
-> NATURAL LEFT JOIN phones;
___ih_hl_end
+------+--------------+---------------+
| code | name | tel |
+------+--------------+---------------+
| S001 | Fruits Shop | BBB-BBBB-BBBB |
| S001 | Fruits Shop | AAA-AAAA-AAAA |
| S002 | Food Shop | YYY-YYYY-YYYY |
| S002 | Food Shop | XXX-XXXX-XXXX |
| S003 | Dessert Shop | NULL |
+------+--------------+---------------+
5 rows in set (0.00 sec)
23行目が左外部結合(自然結合)の部分です。
shopsテーブルのcodeカラムとphonesテーブルのcodeで左外部結合しています。
NATURAL RIGHT JOIN
MySQLで右外部結合(自然結合)を実現するにはNATURAL RIGHT JOIN句を使用します。
基本構文
SELECT 表示カラム FROM テーブルA NATURAL RIGHT JOIN テーブルB
左外部結合のRIGHT JOIN句の先頭にNATURALを記述します。
自然結合は自動で結合するカラムを判定するため、結合条件は不要です。
サンプル
mysql> SELECT * FROM shops;
+------+--------------+
| code | name |
+------+--------------+
| S001 | Fruits Shop |
| S002 | Food Shop |
| S003 | Dessert Shop |
+------+--------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM phones;
+------+---------------+
| code | tel |
+------+---------------+
| S001 | AAA-AAAA-AAAA |
| S001 | BBB-BBBB-BBBB |
| S002 | XXX-XXXX-XXXX |
| S002 | YYY-YYYY-YYYY |
+------+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM shops
___ih_hl_start
-> NATURAL RIGHT JOIN phones;
___ih_hl_end
+------+---------------+-------------+
| code | tel | name |
+------+---------------+-------------+
| S001 | AAA-AAAA-AAAA | Fruits Shop |
| S001 | BBB-BBBB-BBBB | Fruits Shop |
| S002 | XXX-XXXX-XXXX | Food Shop |
| S002 | YYY-YYYY-YYYY | Food Shop |
+------+---------------+-------------+
4 rows in set (0.00 sec)
23行目が右外部結合(自然結合)の部分です。
shopsテーブルのcodeカラムとphonesテーブルのcodeで右外部結合しています。