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のデータを全て残すようにする方法のことをいう。





