結合とは,異なる行を1つの行にして問い合わせることを言います。

 次に示すEMP(社員)表とDEPT(部門)表を見てみましょう(図1図2)。

図1●EMP(社員)表
図1●EMP(社員)表 [画像のクリックで拡大表示]

図2●DEPT(部門)表
図2●DEPT(部門)表

 EMP表には,社員番号(EMPNO)7369のSMITHさんがいます(1行目)。部門番号(DEPTNO)が20の部門で働いているようですが,それが何と言う部署名なのかはEMP表だけではわかりません。しかし,DEPT表のDEPTNOが20の行と合わせれば,それがRESEARCHという部門名でDALLASという場所にあることがわかります。そこで,このEMP表のSMITHさんの行とDEPT表のRESEARCHの行を結合して問い合わせてみましょう。

 表示したいのが,EMPNO,ENAME,DNAME,LOCであれば,SELECT句には次のように記述します。

SELECT EMPNO,ENAME,DNAME,LOC

 上記の列は,EMPNO,ENAMEはEMP表から,DNAME,LOCはDEPT表から取り出さなければいけませんから,FROM句には,次のように,EMP表とDEPT表を記述します。

FROM EMP,DEPT

 では,このSELECT句とFROM句の記述のまま,SQLを実行してみましょう(図3)。

図3●SELECT句とFROM句だけで結合を行う
図3●SELECT句とFROM句だけで結合を行う

 図3では,途中で省略してしまいましたが,全部で56行表示されました。EMP表には14件しかなかったのに(図1参照),なぜ56行なのでしょうか?

 これは,EMP表の14件とDEPT表の4件を乗算した結果です。こういう結合を「クロス結合」または「直積」と言います。

 図3では,どこの表から何の列を取り出して欲しいかは記述しましたが,「SMITHさんはDEPTNOが20だから,DEPT表のDEPTNOが20の行と合わせて表示して欲しい」という条件は記述しませんでした。

 この条件のことを「結合条件」と言います。結合条件は検索する行を絞り込むときに使用するWHERE句に記述することができます。今回の結合条件は「EMP表のDEPTNO列の値とDEPT表のDEPTNO列の値が等しいもの同士を合わせて欲しい」なので,WHERE句に次のように記述します。

WHERE EMP.DEPTNO = DEPT.DEPTNO

 では,結合条件も指定して,実行してみましょう(図4)。

図4●結合条件を指定して実行する
図4●結合条件を指定して実行する