INDEX
表結合
SQL99構文をサポートしているDBならJOIN句による結合は同じ構文が利用できる(FULL OUTER JOINは微妙だけど)。Where句に各書き方で、等価結合は大体どのDBでもいける。外部結合はどうだろう…。
SQL:1999構文を使用しての結合
SELECT 表名1.列名 , 表名2.列名
FROM 表名1
{CROSS JOIN 表名2 }
または {NATURAL JOIN 表名2 }
または {JOIN 表名2 USING (列名) }
または {JOIN 表名2 ON (表名1.列名 = 表名2.列名 ) }
または {LEFT | RIGHT | FULL OUTER JOIN 表名2 ON (表名1.列名 = 表名2.列名 ) }
;
- CROSS JOIN 表名2
- 2つの表から直積演算を戻します
- NATURAL JOIN 表名2
- 2つの表の中の同じ列名に基づいて結合します
- JOIN 表名2 USING (列名)
- USING句の列名に基づいて等価結合をします
- JOIN 表名2 ON (表名1.列名 = 表名2.列名)
- ON句の条件に基づいて結合します
- LEFT | RIGHT | FULL OUTER JOIN 表名2 ON (表名1.列名 = 表名2.列名 )
- ON句の条件に基づいて外部結合をします
CROSS JOIN - クロス結合
CROSS JOIN句は、2つの表のクロス積(直積)を生成します。
SELECT 〜 FROM 表1 CROSS JOIN 表2 ;
下記と等価になる
SELECT 〜 FROM 表1 , 表2 ;
NATURAL JOIN - 自然結合
NATURAL JOIN句は、2つの表の同じ名前のすべての列に基づいて結合します。
SELECT 〜 FROM 表1 NATURAL JOIN 表2 ;
下記と等価になる(表1と表2にIDのみ同じ列が存在する)
SELECT 〜 FROM 表1 , 表2 WHERE 表1.ID = 表2.ID ;
NATURAL JOIN句を使用した場合に何が良いかと言うと、「対応する表の列を明示的に指定しなくても良い」ということです。逆を返せば、「対応する表の列を正しく知らないと、どのように結合されるかがわからない」と言うことになります。
このように自然結合とは、名前とデータ型が一致するすべての列を使用して表を結合するものです。ただし、結合する表で同じ名前である列が異なるデータ型の場合には、エラーになる。
JOIN(USING) - USING句による等価結合
JOIN USING句は、2つの表にある同じ名前の列の内、指定した列で結合します。
SELECT 〜 FROM 表1 JOIN 表2 USING (ID) ;
下記と等価になる
SELECT 〜 FROM 表1 , 表2 WHERE 表1.ID = 表2.ID ;
NATURAL JOIN句と異なり結合を行う時の基となる列名を明示的に指定できる。そのため、同じ名前の列が存在しても指定していない列を基に結合されない。なので、結合に利用しない列ならば、名前が同じでデータ型が異なる場合でもエラーにならない。
NATURAL JOIN句とは排他利用となる。また、USING句に指定した列は表名などの修飾子を使用することは出来ない。
JOIN(ON) - ON句による等価結合
JOIN ON句は、2つの表にある任意の列で結合します。
SELECT 〜 FROM 表1 JOIN 表2 ON 表1.ID = 表2.NO ;
下記と等価になる
SELECT 〜 FROM 表1 , 表2 WHERE 表1.ID = 表2.NO ;
NATURAL JOIN や JOIN USING 句の場合、結合に利用する列は同じ名前である必要があるが、ON句は任意の列や条件を指定することが出来る。また、WHERE句に書く方法と比べると、結合条件が他の抽出条件から分離される。
複数の表を結合するときは以下のようにする。
SELECT 〜 FROM 表1 JOIN 表2 ON 表1.PID = 表2.PID JOIN 表3 ON 表2.CID = 表2.CID ;
OUTER JOIN - 外部結合
参考資料
http://www.seshop.com/se/edu/shikaku/omo/miti/silver_miti.asp?educat=silver2
最終更新時間:2008年11月14日 15時40分00秒 指摘や意見などあればSandBoxのBBSへ。