DB上でテーブル結合を行う方法には内部結合と外部結合があり、また、外部結合には左外部結合・右外部結合・完全外部結合の3種類がある。
今回は、Oracle上でいろいろなテーブル結合を行ってみたので、その結果を共有する。
前提条件
下記記事の「外部結合で利用するテーブルデータの作成」が完了していること。

さらに、deptテーブルにDEPT_ID=’006’のデータを追加する。作成したテーブルデータの中身は、以下の通り。
select * from dept

select * from employee

やってみたこと
内部結合
内部結合とは、テーブルA(employee)とテーブルB(dept)をそのまま結合し、完全に一致したものを取得する方法のことをいう。その実行結果は、以下の通り。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp inner join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、上記のSQL文のうち、以下のように「inner」を省略しても、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、以下のように、joinを使用しないSQL文でも、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp, dept where emp.dept_id = dept.dept_id order by emp.emp_id


左外部結合
左外部結合とは、テーブルA(employee)とテーブルB(dept)を結合する際、テーブルA(employee)のデータを全て残すようにする方法のことをいう。その実行結果は、以下の通り。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp left outer join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、上記のSQL文のうち、以下のように「outer」を省略しても、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp left join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、以下のように、joinを使用しないSQL文でも、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp, dept where emp.dept_id = dept.dept_id(+) order by emp.emp_id

なお、外部結合するテーブルに取得条件を加えた場合については、以下の記事を参照のこと。

右外部結合
右外部結合とは、テーブルA(employee)とテーブルB(dept)を結合する際、テーブルB(dept)のデータを全て残すようにする方法のことをいう。その実行結果は、以下の通り。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp right outer join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、上記のSQL文のうち、以下のように「outer」を省略しても、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp right join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、以下のように、joinを使用しないSQL文でも、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp, dept where emp.dept_id(+) = dept.dept_id order by emp.emp_id


完全外部結合
完全外部結合とは、テーブルA(employee)とテーブルB(dept)を結合する際、テーブルA(employee)とテーブルB(dept)のデータを全て残すようにする方法のことをいう。その実行結果は、以下の通り。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp full outer join dept on dept.dept_id = emp.dept_id order by emp.emp_id

また、上記のSQL文のうち、以下のように「outer」を省略しても、同じように実行できる。
select emp.emp_id, emp.name as emp_name, emp.dept_id , dept.name as dept_name, dept.start_dt, dept.end_dt, dept.del_flg from employee emp full join dept on dept.dept_id = emp.dept_id order by emp.emp_id

なお、「join」を指定しないSQL文では、完全外部結合については実行できない。
要点まとめ
- テーブル結合を行う方法として、内部結合と3種類の外部結合(左外部結合・右外部結合・完全外部結合)がある。
- 内部結合とは、テーブルAとテーブルBをそのまま結合し、完全に一致したものを取得する方法のことをいう。
- 外部結合とは、テーブルAとテーブルBを結合する際、テーブルAまたはテーブルBのデータを全て残すようにする方法のことをいう。