Oracle SQLでは、複数のテーブルを結合してデータを取得する機会が多くあります。その際に使うのが「JOIN句」です。JOIN句を正しく使えるようになると、データベースの力をより引き出せるようになります。
この記事では、初心者向けにJOINの基本から、内部結合・外部結合・自己結合の違い、そして書き方や実行結果までを、わかりやすくテキスト図を交えて解説します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
JOINとは何か?
JOINは「複数のテーブルを条件に基づいて結合し、1つの結果セットとして扱う」ためのSQL句です。たとえば、社員情報と部署情報をそれぞれ別のテーブルで管理している場合、それらを組み合わせて「誰がどの部署に所属しているか」を表示することができます。
使用するテーブルの作成
以下の2つのテーブルを例に解説します。
-- 部署テーブル
CREATE TABLE departments (
dept_id NUMBER PRIMARY KEY,
dept_name VARCHAR2(50)
);
INSERT INTO departments VALUES (10, '総務部');
INSERT INTO departments VALUES (20, '営業部');
INSERT INTO departments VALUES (30, '開発部');
-- 社員テーブル
CREATE TABLE employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(50),
dept_id NUMBER
);
INSERT INTO employees VALUES (1, '田中太郎', 10);
INSERT INTO employees VALUES (2, '佐藤花子', 20);
INSERT INTO employees VALUES (3, '鈴木次郎', NULL);
作成した表を select した結果
SQL> set lin 1000
SQL> col dept_name for a30
SQL> select * from departments;
DEPT_ID DEPT_NAME
---------- ------------------------------
10 総務部
20 営業部
30 開発部
SQL> col emp_name for a30
SQL> select * from employees;
EMP_ID EMP_NAME DEPT_ID
---------- ------------------------------ ----------
1 田中太郎 10
2 佐藤花子 20
3 鈴木次郎
内部結合(INNER JOIN)
内部結合は、両方のテーブルで結合条件に一致するレコードのみを表示します。
SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.dept_id;
実行結果
| emp_name | dept_name |
|---|---|
| 田中太郎 | 総務部 |
| 佐藤花子 | 営業部 |
解説図:内部結合のイメージ
employees departments
+---------+ +----------+
| dept_id | <---> | dept_id |
+---------+ +----------+
※dept_idが一致するレコードのみ結合される
NULLや一致しないデータ(鈴木次郎など)は表示されません。
SQL> SELECT e.emp_name, d.dept_name
2 FROM employees e
3 INNER JOIN departments d
4 ON e.dept_id = d.dept_id;
EMP_NAME DEPT_NAME
------------------------------ ------------------------------
田中太郎 総務部
佐藤花子 営業部
外部結合(OUTER JOIN)
外部結合は「一致しないデータも含めて」結果を出力します。
左外部結合(LEFT OUTER JOIN)
左側(employees)のデータはすべて表示し、右側(departments)に一致するデータがあれば表示します。
SELECT e.emp_name, d.dept_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.dept_id = d.dept_id;
実行結果
| emp_name | dept_name |
|---|---|
| 田中太郎 | 総務部 |
| 佐藤花子 | 営業部 |
| 鈴木次郎 | NULL |
解説図:左外部結合のイメージ
employees departments
+---------+ +----------+
| dept_id | <---> | dept_id |
+---------+ +----------+
※employeesは全件表示、結合できない場合はNULL
SQL> SELECT e.emp_name, d.dept_name
2 FROM employees e
3 LEFT OUTER JOIN departments d
4 ON e.dept_id = d.dept_id;
EMP_NAME DEPT_NAME
------------------------------ ------------------------------
田中太郎 総務部
佐藤花子 営業部
鈴木次郎
右外部結合(RIGHT OUTER JOIN)
右側(departments)のデータをすべて表示します。
SELECT e.emp_name, d.dept_name
FROM employees e
RIGHT OUTER JOIN departments d
ON e.dept_id = d.dept_id;
実行結果
| emp_name | dept_name |
|---|---|
| 田中太郎 | 総務部 |
| 佐藤花子 | 営業部 |
| NULL | 開発部 |
補足:RIGHT OUTER JOINは、LEFT OUTER JOINのテーブル順を入れ替えた形です。
SQL> SELECT e.emp_name, d.dept_name
2 FROM employees e
3 RIGHT OUTER JOIN departments d
4 ON e.dept_id = d.dept_id;
EMP_NAME DEPT_NAME
------------------------------ ------------------------------
田中太郎 総務部
佐藤花子 営業部
開発部
自己結合(SELF JOIN)
同じテーブル同士を結合する方法です。
例:社員同士のメンター関係を保持したい場合
-- メンター関係を追加
ALTER TABLE employees ADD mentor_id NUMBER;
UPDATE employees SET mentor_id = 1 WHERE emp_id = 2; -- 佐藤のメンターは田中
-- 自己結合でメンターの名前を取得
SELECT e.emp_name AS mentee, m.emp_name AS mentor
FROM employees e
LEFT JOIN employees m
ON e.mentor_id = m.emp_id;
実行結果
| mentee | mentor |
|---|---|
| 田中太郎 | NULL |
| 佐藤花子 | 田中太郎 |
| 鈴木次郎 | NULL |
解説図:自己結合のイメージ
employees e employees m
+---------+ +---------+
| mentor_id| <---> | emp_id |
+---------+ +---------+
※自分のmentor_idを同じテーブルのemp_idと結合
SQL> ALTER TABLE employees ADD mentor_id NUMBER;
表が変更されました。
SQL> UPDATE employees SET mentor_id = 1 WHERE emp_id = 2;
1行が更新されました。
SQL> select * from employees;
EMP_ID EMP_NAME DEPT_ID MENTOR_ID
---------- ------------------------------ ---------- ----------
1 田中太郎 10
2 佐藤花子 20 1
3 鈴木次郎
SQL> commit;
コミットが完了しました。
SQL> col mentee for a30
SQL> col mentor for a30
SQL> SELECT e.emp_name AS mentee, m.emp_name AS mentor
2 FROM employees e
3 LEFT JOIN employees m
4 ON e.mentor_id = m.emp_id;
MENTEE MENTOR
------------------------------ ------------------------------
田中太郎
佐藤花子 田中太郎
鈴木次郎
Oracle独自の外部結合記法(非推奨)
古いOracleでは、(+)を使って外部結合を表現していました。
SELECT e.emp_name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.dept_id(+);
この形式は可読性が低く、ANSI構文(JOIN句)を使用することが推奨されます。
SQL> SELECT e.emp_name, d.dept_name
2 FROM employees e, departments d
3 WHERE e.dept_id = d.dept_id(+);
EMP_NAME DEPT_NAME
------------------------------ ------------------------------
田中太郎 総務部
佐藤花子 営業部
鈴木次郎
まとめ
| 結合タイプ | 特徴 |
|---|---|
| INNER JOIN | 両方に一致するデータのみ |
| LEFT OUTER JOIN | 左側の全データ+一致する右側データ |
| RIGHT OUTER JOIN | 右側の全データ+一致する左側データ |
| SELF JOIN | 同じテーブル同士の結合 |
JOIN句はSQLを使いこなす上で欠かせない重要な技術です。特に複数テーブルからの情報取得が多い業務では、JOIN句を自在に使いこなせるようになることが大きな強みになります。
[参考]
SQL言語リファレンス – 結合
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント