自然結合


等結合は、結合に用いたカラムが2つずつ表示されており冗長です。これを排除したものが『自然結合』です。
自然結合には、NATURAL JOIN句を用います。

構文

SELECT カラム FROM テーブル1 NATURAL JOIN テーブル2

NATURAL JOIN句では、自動的に結合する2つのテーブルの同名のカラムの値が等しい組み合わせを取り出します。
従ってON句による条件の記述は行いません。

例:【subject_list】と【teacher_list】の自然結合
SQL
SELECT * FROM subject_list NATURAL JOIN teacher_list;

内部結合のものと似ていますが、teacher_idカラムが1つしかないことが判ります。

NATURAL JOIN句を用いた結合は簡潔に記述できるのですが、結合したいテーブル間で
・結合に使うカラムが同名であること
・結合に使うカラム以外に同名のカラムがないこと
を満たしていないと結合できないという欠点があります。

同じ結果をWHERE句の利用およびSELECT句の表示カラムリストを用いて得ることも出来ます。
こちらの書式では結合条件を明記するため、記述は長くなるもののNATURAL JOIN句のような欠点はありませんので、こちらの書式が使われることも少なくありません。

例:【subject_list】と【teacher_list】の自然結合をWHERE句を用いて記述
SQL
SELECT subject_list.*, teacher_name, ex_number
FROM subject_list, teacher_list
WHERE subject_list.teacher_id=teacher_list.teacher_id ;

表示するカラムを指定するとき、あるテーブルのカラムをすべて表示するならば

テーブル名.*と記述します。

カラムを個別に指定する場合、他のテーブルに同名のカラムがない場合はカラム名のみを記述できます。他のテーブルに同名のカラムがある場合は

テーブル名.カラム名と記述します。


結果


この場合も、直積結合から結合条件を満たしたものを取り出し、カラム表示の冗長部分を排除するという手順です。

3つ以上のテーブルを自然結合する場合

基本的な考え方は内部結合の時と同じです。

例:【registration_list】と【subject_list】と【student_list】の自然結合
SQL
SELECT * FROM registration_list
NATURAL JOIN subject_list
NATURAL JOIN student_list;
結果


WHERE句で記述することもできます。

SQL
SELECT registration_list.*,
subject_name, teacher_id, student_name
FROM registration_list, subject_list, student_list
WHERE registration_list.subject_id=subject_list.subject_id AND
registration_list.student_id=student_list.student_id;

これはNATURAL JOIN句を利用したものとまったく同じ結果を得ることが出来ます。

例:【registration_list】と【subject_list】と【student_list】と【teacher_list】の自然結合
SQL
SELECT * FROM registration_list
NATURAL JOIN subject_list
NATURAL JOIN student_list
NATURAL JOIN teacher_list;
結果


WHERE句を使って記述するとこうなります。

SQL
SELECT registration_list.subject_id, subject_name,
teacher_list.teacher_id, teacher_name, ex_number,
student_list.student_id, student_name
FROM registration_list,subject_list,student_list,teacher_list
WHERE registration_list.student_id=student_list.student_id AND
registration_list.subject_id=subject_list.subject_id AND
subject_list.teacher_id=teacher_list.teacher_id;
結果


コメント

タイトルとURLをコピーしました