English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL FULL JOIN文

このチュートリアルでは、SQL Full Joinを使用して2つのテーブルからデータを取得する方法を学びます。

使用完全なジョイン

FULL JOINは、一致しない場合でも結合テーブルのすべての行を返します。つまり、完全なジョインは LEFT JOINおよびRIGHT JOIN完全なジョインは外部結合の一種の機能です。と呼ばれることもあります。full outer join

以下のビーン図は完全なジョインの動作を説明しています。

注意:外部結合は、結合する二つのテーブルの行が一致しない場合でも結果集中に行を含める結合です。

これを明確に理解するために、以下を見てみましょうemployeesおよびdepartmentsテーブル。

+--------+--------------+------------+---------+
| emp_id | emp_name     | hire_date  | dept_id |
+--------+--------------+------------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |       4 |
|      2 | Tony Montana | 2002-07-15 |       1 |
|      3 | Sarah Connor | 2005-10-18 |       5 |
|      4 | Rick Deckard | 2007-01-03 |       3 |
|      5 | Martin Blank | 2008-06-24 |    NULL |
+--------+--------------+------------+---------+

+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | 管理   |
|       2 | Customer Service |
|       3 | 財務          |
|       4 | Human Resources  |
|       5 | 販売          |
+---------+------------------+
テーブル: employees
テーブル: departments

今度は、すべての従業員の名前と利用可能な部署の名前のみを取得したい場合、他のテーブルに対応する行がなくても良い場合、完全なジョインを使用します。以下のようにします。

以下のクエリは、一般的なdept_idフィールドを使用してemployeeとdepartmentテーブルを結合し、すべての部署およびすべての従業員の詳細を取得します。

SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 FULL JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY emp_name;

一部のデータベース(例えばOracle、MySQL)では完全なジョインをサポートしていません。その場合、LEFT JOINとRIGHT JOINをUNION ALL演算子で組み合わせることができます。以下のようにします:

SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 LEFT JOIN departments AS t2
ON t1.dept_id = t2.dept_id
UNION ALL
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name
FROM employees AS t1 RIGHT JOIN departments AS t2
ON t1.dept_id = t2.dept_id ORDER BY emp_name;

コマンドを実行した後、以下のような出力が得られます:

+--------+--------------+------------+------------------+
| emp_id | emp_name     | hire_date  | dept_name        |
+--------+--------------+------------+------------------+
|   NULL | NULL         | NULL       | Customer Service |
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources  |
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources  |
|      5 | Martin Blank | 2008-06-24 | NULL           |
|      4 | Rick Deckard | 2007-01-03 | 財務          |
|      4 | Rick Deckard | 2007-01-03 | 財務          |
|      3 | Sarah Connor | 2005-10-18 | 販売          |
|      3 | Sarah Connor | 2005-10-18 | 販売          |
|      2 | Tony Montana | 2002-07-15 | 管理   |
|      2 | Tony Montana | 2002-07-15 | 管理   |
+--------+--------------+------------+------------------+

ご覧の通り、結果にはdepartmentsおよびemployeesテーブルのすべての行。

ヒント:結合クエリでは、左テーブルはJOIN子句で最も左側に現れるテーブルであり、右テーブルは最も右側に現れるテーブルです。

注意:外部リンクを执行した際に、DBMS(データベース管理システム)が行を一致させることができず、データが存在しないことを示すために、列にNULLを配置します。