SQL テーブル結合について
SQLで行える処理に、テーブル結合がある。SQLを久々に書いているのでテーブル結合も概念レベルから忘れていたが、重要な概念となるので、ここでまとめてみる。
テーブル結合とは
テーブル結合とは、文字通り2つのテーブルを繋いで一つにする処理である。基本は、2つのテーブルでそれぞれ特定のフィールドを指定し、その両者のフィールドの値が一致するレコード同士をつなげる。
結合の仕方も複数あり、大きく以下の2種類がある。
外部結合
内部結合
それぞれの内容について書いていく。
外部結合(OUTER JOIN)
外部結合の定義は、以下の通り。
外部結合とは、リレーショナルデータベースのテーブルを連結する操作の一つで、二つのテーブルからそれぞれ特定のフィールドを指定し、両者の値が一致するレコード同士は連結し、一致するものが存在しないレコードはそのまま抽出するもの。SQL文ではSELECT文のOUTER JOIN句で指定する。
外部結合には、いくつか種類がある。上の定義だけ見てもイメージがつきにくいが、このいくつかの種類の外部結合の具体例を見ると、少しイメージが湧きやすくなると思う。
外部結合には、以下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つのテーブルがあったとする。
![](https://assets.st-note.com/img/1669294397948-Rt4rFizNb8.png)
![](https://assets.st-note.com/img/1669294426412-Uxt2LEFtaT.png)
上記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;
実行結果は以下の通り。
![](https://assets.st-note.com/img/1669294969290-0AyqfAfJo4.png)
次に、右結合について説明する。右結合は、左結合の逆と考える。つまり、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の実行結果は以下の通り。
![](https://assets.st-note.com/img/1669295444120-1qSQIQBcNr.png)
内部結合(INNER JOIN)
内部結合の定義は以下の通り。
内部結合とは、リレーショナルデータベースのテーブルを連結する操作の一つで、二つのテーブルからそれぞれ特定のフィールドを指定し、両者の値が一致するレコード同士を連結するもの。SQL文ではSELECT文のINNER JOIN句で指定する。
空レコードがくっつきにいくことのない左結合・右結合とざっくり考えられる。
上記外部結合の例でも用いた以下テーブルを例に、内部結合について説明する。
![](https://assets.st-note.com/img/1669294397948-Rt4rFizNb8.png)
![](https://assets.st-note.com/img/1669294426412-Uxt2LEFtaT.png)
上記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;
実行結果は以下の通り。
![](https://assets.st-note.com/img/1669296108864-FBxiGf8efK.png)
終わりに
今回は、SQLの代表的な結合について説明した。外部結合と内部結合は、いわゆる横型の結合(レコード同士を横にくっつける)だったが、他にも縦型の結合(UNION句を用いて、レコードを縦にくっつける)がある。勉強がてら、また投稿したい。