MySQLの結合(JOIN)とは?基本概念と4つの結合タイプを実例付きで解説
MySQLの結合(JOIN)とは
MySQLのSELECT文は、基本的に1つのテーブルから情報を取得するために使われます。しかし、実際のデータベース操作では、1つのテーブルだけでは答えられない問い合わせも数多く存在します。そのような場合、複数のテーブルに保存された情報を組み合わせて取得するために「結合(JOIN)」という操作を使用します。
結合の基本的な仕組み
MySQLの結合とは、2つ以上のテーブルに共通する列の値を基準にして、それらのテーブル同士のデータを関連付ける手法です。結合の結果として、新しい一時テーブルが生成されます。つまり、論理的に関連性のある複数のテーブルからレコードを取得し、1つの結果セットにまとめることができるのです。
この新しい一時テーブルは、結合対象となる2つのテーブルが共有している列(比較として意味を持つ列)に基づいて作成されます。
結合キーとは
結合で使用される共通の値は、通常、結合対象の両方のテーブルに同じ列名・同じデータ型で現れるものです。このような列は「結合キー」または「共通キー」と呼ばれます。
MySQLでサポートされる主な結合の種類
MySQLでは、主に以下の4種類の結合がサポートされています。
クロス結合(CROSS JOIN)
クロス結合は、結合の最も基本的な形です。2つのテーブルがある場合、テーブル1の各行に対してテーブル2のすべての行を順番に組み合わせます。したがって、テーブル1が3行、テーブル2が2行ある場合、クロス結合の結果は合計6行になります。
ここでは、次のようなデータを持つtbl_1とtbl_2という2つのテーブルを例に説明します。
mysql> Select * from tbl_1; +----+--------+ | Id | Name | +----+--------+ | 1 | Gaurav | | 2 | Rahul | | 3 | Raman | | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from tbl_2; +----+---------+ | Id | Name | +----+---------+ | A | Aarav | | B | Mohan | | C | Jai | | D | Harshit | +----+---------+ 4 rows in set (0.00 sec)
以下のクエリを実行すると、上記の2つのテーブル間でCROSS JOINが実行され、すべての行の組み合わせが取得できます。
mysql> Select tbl_1.id, tbl_2.id FROM tbl_1 CROSS JOIN tbl_2; +----+----+ | id | id | +----+----+ | 1 | A | | 2 | A | | 3 | A | | 4 | A | | 1 | B | | 2 | B | | 3 | B | | 4 | B | | 1 | C | | 2 | C | | 3 | C | | 4 | C | | 1 | D | | 2 | D | | 3 | D | | 4 | D | +----+----+ 16 rows in set (0.00 sec)
内部結合(INNER JOIN/等価結合)
内部結合を行うには、「結合述語」と呼ばれる特定の条件を指定する必要があります。内部結合(等価結合)では、結合される2つのテーブルの行が、指定した列で一致する値を持つことが求められます。
以下のクエリは、tbl_1とtbl_2をname列を基準に内部結合する例です。
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 INNER JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+----+ | id | id | +----+----+ | 4 | A | +----+----+ 1 row in set (0.00 sec)
結果セットを見ると、tbl_1のid=4の行とtbl_2のid='A'の行が、name列で同じ値(Aarav)を持っているためマッチしていることがわかります。
左外部結合(LEFT JOIN)
左外部結合でも、内部結合と同様に結合述語が必要です。ただし、LEFT JOINで2つのテーブルを結合する際には「左テーブル」と「右テーブル」という概念が導入される点が異なります。LEFT JOINは、結合述語を満たす行だけでなく、満たさない行も含めて、左テーブルのすべての行を返します。結合述語に一致しない行については、結果セットの右テーブル側の列にNULLが表示されます。
以下のクエリは、tbl_1とtbl_2を使ってLEFT JOINを実行する例です。
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+------+ | id | id | +----+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | A | +----+------+ 4 rows in set (0.02 sec)
右外部結合(RIGHT JOIN)
RIGHT JOINは、LEFT JOINと似ていますが、左右のテーブルの扱いが逆になっています。RIGHT JOINでは、右テーブルのすべての行が結果セットに現れます。右テーブルの行のうち、左テーブルに一致する行がないものについては、左テーブル側の列にNULLが表示されます。
以下のクエリは、tbl_1とtbl_2を使ってRIGHT JOINを実行する例です。
mysql> SELECT tbl_1.id,tbl_2.id -> FROM tbl_1 RIGHT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +------+----+ | id | id | +------+----+ | 4 | A | | NULL | B | | NULL | C | | NULL | D | +------+----+ 4 rows in set (0.00 sec)
まとめ
MySQLの結合を使いこなせるようになると、複数のテーブルに分散したデータを柔軟に組み合わせられるようになります。クロス結合・内部結合・左外部結合・右外部結合のそれぞれの特性を理解し、目的に応じて適切な結合タイプを選択することが、効率的なデータベース操作への第一歩です。
-
MySQLがサポートするプラットフォーム一覧|対応OSとアーキテクチャを徹底解説
MySQLは非常に多くのプラットフォームに対応したデータベース管理系统であり、仮想環境へのデプロイにも柔軟に対応できます。本記事では、MySQLが公式にサポートしているオペレーティングシステムと、それぞれの対応アーキテクチャ(CPUアーキテクチャ)について詳しく解説します。 Oracle Linux / Red Hat Enterprise Linux / CentOS エンタープライズ用途で広く採用されているRHEL系ディストリビューションでは、以下のバージョンがサポート対象です。 Oracle Linux 8 / Red Hat Enterprise Linux 8 / CentOS
-
C#のリフレクションとは?実行時に型情報と属性を取得する方法を解説
C#におけるリフレクション(Reflection)とは、プログラムの実行時に型(クラス・構造体・インターフェースなど)の情報を動的に取得・操作するための仕組みです。通常、コードはコンパイル時に型が確定しますが、リフレクションを使うことで、実行中にアセンブリやメタデータへアクセスし、クラスのメンバー(メソッド・プロパティ・フィールド)や属性(Attribute)の情報を調べることができます。System.Reflection名前空間実行中のプログラムのメタデータにアクセスするためのクラス群は、System.Reflection名前空間にまとめられています。この名前空間には、Type、Member