MySQL での完全結合

Preet Sanghavi 2023年1月3日
MySQL での完全結合

このチュートリアルは、MySQL で完全結合または完全外部結合を実行する方法を探ることを目的としています。

完全外部結合は、2つの別々のテーブルからのデータ全体をマージまたは結合するために使用されます。たとえば、student_idstudent_name という名前の 2つのテーブルがあり、共通の列があるとします。

共通列の値を UNIONLEFT JOIN、および RIGHT JOIN と照合することにより、これら 2つのテーブルを MySQL で完全にマージできます。このプロセスは一見複雑に見えますが、段階的に理解していきましょう。

始める前に、数行の student_details テーブルを作成してダミーのデータセットを作成します。

-- create the table student_details
CREATE TABLE student_details(
  stu_id int,
  stu_firstName varchar(255) DEFAULT NULL,
  stu_lastName varchar(255) DEFAULT NULL,
  primary key(stu_id)
);
-- insert rows to the table student_details
INSERT INTO student_details(stu_id,stu_firstName,stu_lastName) 
 VALUES(1,"Preet","Sanghavi"),
 (2,"Rich","John"),
 (3,"Veron","Brow"),
 (4,"Geo","Jos"),
 (5,"Hash","Shah"),
 (6,"Sachin","Parker"),
 (7,"David","Miller");

データのエントリを表示するには、次のコードを使用します。

SELECT * FROM student_details;

出力:

stu_id	stu_firstName	stu_lastName
1	      Preet	        Sanghavi
2	      Rich	        John
3	      Veron	        Brow
4	      Geo	        Jos
5	      Hash	        Shah
6	      Sachin	    Parker
7	      David	        Miller

stu_id に対応する各学生のマークを含む student_marks という名前の別のテーブルが必要です。次のクエリを使用して、このようなテーブルを作成できます。

-- create the table student_marks
CREATE TABLE student_marks(
  stu_id int,
  stu_marks int
);
-- insert rows to the table student_marks
INSERT INTO student_marks(stu_id,stu_marks) 
 VALUES(1,10),
 (2,20),
 (3,30),
 (4,7),
 (5,9),
 (6,35),
 (7,15);

次のクエリを使用して、このテーブルを視覚化できます。

SELECT * from student_marks;

出力:

stu_id  stu_marks
1		10
2		20
3		30
4		7
5		9
6		35
7		15

両方のテーブルの共通列として stu_id を使用して、student_details テーブルと student_marks テーブルで完全外部結合を作成することを目指しましょう。

MySQL の FULL JOIN ステートメント

FULL OUTER JOIN 手法の基本的な構文は次のとおりです。

SELECT * FROM table_1
LEFT JOIN table_2 ON table_1.id = table_2.id
UNION
SELECT * FROM table_1
RIGHT JOIN table_2 ON table_1.id = table_2.id

上記のクエリに見られるように、左結合右結合を使用して、共通の id 列に基づいて table_1table_2 という名前の 2つのテーブルを結合することを目指しています。

次のクエリを使用して、student_details テーブルと student_marks テーブルの問題を解決できます。

-- Full Join using UNION
SELECT * FROM student_details
LEFT JOIN student_marks ON student_details.stu_id = student_marks.stu_id
UNION
SELECT * FROM student_details
RIGHT JOIN student_marks ON student_details.stu_id = student_marks.stu_id

上記のコードに見られるように、stu_id 列に基づいて検討中の両方のテーブルをマージしています。上記のコードの出力は次のとおりです。

stu_id	stu_firstName	stu_lastName  stu_id	stu_marks
1		Preet			Sanghavi		1		10
2		Rich			John			2		20
3		Veron			Brow			3		30
4		Geo				Jos				4		7
5		Hash			Shah			5		9
6		Sachin			Parker			6		35
7		David			Miller			7		15

出力ブロックに示されているように、完全外部結合後の stu_id に基づいて、stu_marks が各学生に正しく割り当てられます。

左結合右結合を使用して結合する正確な列名を指定することにより、列 stu_id の重複を回避できます。これにより、クエリの UNION 句が原因で、重複行のない外部結合が作成されます。

したがって、2つの異なるテーブルでの左結合右結合とともに UNION ステートメントを使用すると、重複する行がなくても、MySQL で完全外部結合を効率的に作成できます。

著者: Preet Sanghavi
Preet Sanghavi avatar Preet Sanghavi avatar

Preet writes his thoughts about programming in a simplified manner to help others learn better. With thorough research, his articles offer descriptive and easy to understand solutions.

LinkedIn GitHub

関連記事 - MySQL Query