【初心者向け】表の結合入門

SQL

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_namedept_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_namedept_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_namedept_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;

実行結果

menteementor
田中太郎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専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました