自然結合
外部結合ではONやUSINGの後にどのようにテーブルを結合するのかを指定していましたが、自然結合では2つのテーブルで同じカラム名が含まれる場合、自動的にそのカラムを使って結合が行われます。基本となる構文は次の2つが用意されています。
SELECT table_name.col_name, ... FROM tbl_name1 NATURAL LEFT JOIN tbl_name2;
SELECT table_name.col_name, ... FROM tbl_name1 NATURAL RIGHT JOIN tbl_name2;
どのカラムで結合するのかを指定する必要がない反面、それぞれのテーブルで同じカラムが含まれていた場合は自動的に結合のカラムとして扱われてしまいますので注意が必要です。
なお外部結合においてUSINGを使用した場合と同じく、結合後のデータには結合に使われたカラムは一つしか含まれません。
テーブルの結合
具体的な例で見てみます。次のような2つのテーブルを用意しました。(今までサンプルで使っていたテーブルのカラム名を変更しています)。
goods :
| code | id | goodsname |
|---|---|---|
| B001 | 1 | 旅行に行こう |
| D001 | 2 | 地球の歴史 |
| F001 | 3 | 栗きんとん |
| D002 | 2 | 宇宙旅行 |
| F002 | 3 | ロールケーキ |
| D003 | 2 | 七人の勇者 |
| B002 | 1 | 三国志 |
| S001 | 5 | 表計算ソフト |
| B003 | 1 | 趣味と実益 |
cate :
| id | catename |
|---|---|
| 1 | 和書 |
| 2 | DVD |
| 3 | 食品 |
| 4 | 家電 |
自然結合を行うには、例えば次のように指定します。
SELECT * FROM goods NATURAL LEFT JOIN cate;
上記の場合、「goods」テーブルと「cate」テーブルの両方に存在するカラムは「id」カラムだけですので「id」カラムを使って結合が行われます。
結合後のデータがどのように取得されるのかは外部結合の場合と同じです。詳しくは「外部結合(LEFT JOIN句, RIGHT JOIN句)」を参照して下さい。
先ほどのSQL文を実行すると次のようなデータを取得します。
| id | code | goodsname | catename |
|---|---|---|---|
| 1 | B001 | 旅行に行こう | 和書 |
| 2 | D001 | 地球の歴史 | DVD |
| 3 | F001 | 栗きんとん | 食品 |
| 2 | D002 | 宇宙旅行 | DVD |
| 3 | F002 | ロールケーキ | 食品 |
| 2 | D003 | 七人の勇者 | DVD |
| 1 | B002 | 三国志 | 和書 |
| 5 | S001 | 表計算ソフト | NULL |
| 1 | B003 | 趣味と実益 | 和書 |
結合に使われたカラムが先頭に表示されます。この時、同じカラムは一度しか現れません。その後にそれぞれのテーブルの残りのカラムが表示されます。これはUSINGの場合と同じです。
サンプル
実際に試してみます。まず次のようなテーブルを作成します。
mysql> create table goods (code varchar(5), id int, goodsname varchar(10));
mysql> create table cate (id int, catename varchar(10));
テーブルには次のようなデータを追加してあります。
「goods」テーブルと「cate」テーブルを自然結合(左外部結合)します。2つのテーブルで共通のカラムは「id」カラムです。
mysql> select * from goods natural left join cate;
今度は自然結合(右外部結合)してデータを取得します。
mysql> select * from goods natural right join cate;
( Written by Tatsuo Ikura )
DBOnline