技術コンテンツ

【MySQL】自然結合(NATURAL) - テーブル結合

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