SQL FULL OUTER JOINキーワード

FULL OUTER JOIN は SQL における結合方法の一つで、どちらか一方に一致する項目がない場合でも、2つのテーブルのすべてのレコードを同時に保持します。

FULL OUTER JOIN の結果には、2つのテーブルで条件を満たすレコード(交差部分)と、条件を満たさないレコード(和集合のうち交差しない部分)が含まれます。あるレコードが一方のテーブルに存在するが、もう一方のテーブルに一致する項目がない場合、そのレコードの欠落した列は NULL で埋められます。

FULL OUTER JOIN キーワードは、左テーブル(table1)と右テーブル(table2)のいずれかに一致するものがある限り、行を返します。

FULL OUTER JOIN キーワードは、LEFT JOIN と RIGHT JOIN の結果を組み合わせたものです。

SQL FULL OUTER JOIN 構文

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
  • table1、table2:結合する必要がある2つのテーブル。
  • ON table1.column_name=table2.column_name:結合条件を指定します。通常は2つのテーブルに共通するフィールドです。
  • column_name(s) :2つのテーブルから必要なフィールドを選択します。

SQL FULL OUTER JOIN

特徴

  • 2つのテーブルの和集合を返す:一致するレコードと一致しないレコードをすべて含みます。
  • 一致しないレコードの埋め込みNULL:あるレコードが一方のテーブルで一致しない場合、対応するフィールドはNULLで表されます。
  • 等価性:FULL OUTER JOIN含むLEFT JOINとRIGHT JOINの結果。

2つのテーブルがあるとします:StudentsとCourses。

Students テーブル:

StudentID Name
1 Alice
2 Bob
3 Charlie

Courses テーブル:

CourseID StudentID CourseName
101 1 Math
102 2 Science
103 4 History

FULL OUTER JOIN を使用したクエリ

SELECT Students.StudentID, Students.Name, Courses.CourseName
FROM Students
FULL OUTER JOIN Courses
ON Students.StudentID = Courses.StudentID;

クエリの出力結果:

StudentID Name CourseName
1 Alice Math
2 Bob Science
3 Charlie NULL
4 NULL History

説明:

  • StudentID = 1と2は交差部分で、両方のテーブルにデータがあります。
  • StudentID = 3存在し、Studentsテーブルにはあるが、Coursesテーブルに一致するものがないため、CourseName列はNULL。
  • StudentID = 4存在し、Coursesテーブルにはあるが、Studentsテーブルに一致するものがないため、Name列はNULL。

まとめ

JOIN タイプ戻り値の内容
INNER JOIN2つのテーブルの交差部分、一致するレコード
LEFT JOIN左テーブルのすべてのレコード、および一致する右テーブルのレコード
RIGHT JOIN右テーブルのすべてのレコード、および一致する左テーブルのレコード
FULL OUTER JOIN2つのテーブルの和集合部分、一致するレコードと一致しないレコードを含む

デモデータベース

このチュートリアルでは、サンプル サンプルデータベースを使用します。

以下は "Websites" テーブルから抜粋したデータです:

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | サンプル      | http://www.example.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

以下は "access_log" ウェブサイトアクセス記録テーブルのデータです:

+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)

SQL FULL OUTER JOIN の例

次の SQL 文はすべてのウェブサイトアクセス記録を選択します。

MySQL は FULL OUTER JOIN をサポートしていません。SQL Server で以下の例をテストできます。

例

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
FULL OUTER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

注記:FULL OUTER JOIN キーワードは、左テーブル(Websites)と右テーブル(access_log)のすべての行を返します。"Websites" テーブルの行が "access_log" に一致しない場合、または "access_log" テーブルの行が "Websites" テーブルに一致しない場合でも、これらの行も一覧表示されます。

その他の拡張