【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
で右外部結合しています。