SQL テーブル結合について

SQLで行える処理に、テーブル結合がある。SQLを久々に書いているのでテーブル結合も概念レベルから忘れていたが、重要な概念となるので、ここでまとめてみる。

テーブル結合とは

テーブル結合とは、文字通り2つのテーブルを繋いで一つにする処理である。基本は、2つのテーブルでそれぞれ特定のフィールドを指定し、その両者のフィールドの値が一致するレコード同士をつなげる。

結合の仕方も複数あり、大きく以下の2種類がある。

  • 外部結合

  • 内部結合

それぞれの内容について書いていく。

外部結合(OUTER JOIN)

外部結合の定義は、以下の通り。

外部結合とは、リレーショナルデータベースのテーブルを連結する操作の一つで、二つのテーブルからそれぞれ特定のフィールドを指定し、両者の値が一致するレコード同士は連結し、一致するものが存在しないレコードはそのまま抽出するもの。SQL文ではSELECT文のOUTER JOIN句で指定する。

https://e-words.jp/w/外部結合.html#:~:text=外部結合とは、リレーショナル,はそのまま抽出するもの。

外部結合には、いくつか種類がある。上の定義だけ見てもイメージがつきにくいが、このいくつかの種類の外部結合の具体例を見ると、少しイメージが湧きやすくなると思う。

外部結合には、以下3種類がある。

  • 左結合(LEFT JOIN)

  • 右結合(RIGHT JOIN)

  • 完全外部結合(FULL OUTER JOIN)

完全外部結合はほとんど出てこないので、以下では左結合と右結合について説明する。
(なお、MySQLではFULL OUTER JOINを使えない。UNIONという句を使うと完全外部結合を行うことができるので、大きく困ることはない。)

左結合は、SQLで左側に書かれるテーブル1を軸とし、SQLの右側に書かれるテーブル2を結合する際に、テーブル2で結合できるレコードをテーブル1に結合する。

左結合の書式は、以下の通り。

select [カラムリスト] from [テーブル1] left join [テーブル2] on [結合条件];

例えば、以下2つのテーブルがあったとする。

test_table(左側のテーブル1とする)
test2_table(右側のテーブル2とする)

上記2つのテーブルにおいて、test_tableを軸とする場合、test_tableのid2に対してtest2_tableのid2の値が存在するのは1と3になる。つまり、test2_tableのid2=1,3のレコードがtest_tableに対してくっつきにいく。反対に、2は存在しないので、空のレコードがtest_tableにくっつきにいく。

では、以下の通り左結合を行うSQLを実行する。

select t.* t2.year from test_table t left join test2_table t2 on t.id2 = t2.id2;

実行結果は以下の通り。

左結合の結果


次に、右結合について説明する。右結合は、左結合の逆と考える。つまり、SQLで右側に書かれるテーブル2を軸とし、SQLの左側に書かれるテーブル1を結合する際に、テーブル1で結合できるレコードをテーブル2に結合する。

右結合の書式は、以下の通り。

select [カラムリスト] from [テーブル1] right join [テーブル2] on [結合条件];

では、上記test_tableとtest2_tableにおいて、以下のSQLの通りtest2_tableを軸とし、test2_tableに対してtest_tableを結合させる。

select t.*, t2.year from test_table t right join test2_table t2 on t.id2 = t2.id2;

この場合、test2_tableのid2に対して、test_tableに存在するid2は1と3になる。つまり、test_tableのid2=1,3のレコードをtest2_tableにくっつけにいく。一方、test_tableのid2では4が存在しないため、空レコードがtest2_tableにくっつきにいくことになる。

SQLの実行結果は以下の通り。

右結合の結果

内部結合(INNER JOIN)

内部結合の定義は以下の通り。

内部結合とは、リレーショナルデータベースのテーブルを連結する操作の一つで、二つのテーブルからそれぞれ特定のフィールドを指定し、両者の値が一致するレコード同士を連結するもの。SQL文ではSELECT文のINNER JOIN句で指定する。

https://e-words.jp/w/内部結合.html#:~:text=内部結合とは、リレーショナル,同士を連結するもの。

空レコードがくっつきにいくことのない左結合・右結合とざっくり考えられる。

上記外部結合の例でも用いた以下テーブルを例に、内部結合について説明する。

test_table(左側のテーブル1とする)
test2_table(右側のテーブル2とする)

上記2つのテーブルにおいて、test_tableとtest2_tableの両方ともに存在するid2は、1と3である。つまり、id2=1,3のレコードが結合する。

SQLの書き方は以下の通り。

select [カラムリスト] from [テーブル1] inner join [テーブル2] on [結合条件]

実際に、以下の通りSQLを書いてみる。

select t.*, t2.year from test_table t inner join test2_table t2 on t.id2 = t2.id2;

実行結果は以下の通り。

内部結合の結果

終わりに

今回は、SQLの代表的な結合について説明した。外部結合と内部結合は、いわゆる横型の結合(レコード同士を横にくっつける)だったが、他にも縦型の結合(UNION句を用いて、レコードを縦にくっつける)がある。勉強がてら、また投稿したい。

この記事が気に入ったらサポートをしてみませんか?