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つのテーブルから必要なフィールドを選択します。

特徴
- 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 JOIN | 2つのテーブルの交差部分、一致するレコード |
LEFT JOIN | 左テーブルのすべてのレコード、および一致する右テーブルのレコード |
RIGHT JOIN | 右テーブルのすべてのレコード、および一致する左テーブルのレコード |
FULL OUTER JOIN | 2つのテーブルの和集合部分、一致するレコードと一致しないレコードを含む |
デモデータベース
このチュートリアルでは、サンプル サンプルデータベースを使用します。
以下は "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 で以下の例をテストできます。
例
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" テーブルに一致しない場合でも、これらの行も一覧表示されます。
その他の拡張