【SQL】JOINによるテーブルの結合方法とWhere句による結合方法

sql-join-eye

データベースにアクセスするためのSQLを学ぶ時に

複数のテーブルを結合して情報を取得したい場合どうすれば良いかわからない

と考えたことはないでしょうか。

ここでは、SQLの結合方法をいくつかみていきます。

SQLで表同士を結合する方法

sql-join-01

SQLで表同士を結合するときの種類は5つあります。

内部結合 INNER JOIN

内部結合(INNER JOIN)は最もオーソドックスな結合方法です。

結合するテーブルの条件が一致するレコードのみ出力されます。

下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。

table name の要素
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
table address の要素
id address tel
1 横浜 01234567
2 川崎 98765432

SQLは下記になります。

表示結果は下記のように、id同士が一致した行のみが表示されます。

id name kana address tel
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
未経験・初心者向け「SQL鬼練11〜INNER JOIN句を使ったテーブル同士の内部結合〜」

外部結合 LEFT OUTER JOIN

外部結合のうち(LEFT OUTER JOIN)もよく使われるSQLです。

この場合、条件式の左側のテーブルの対象レコードは全て表示されます。右側のテーブルは、条件が一致した行のみ表示され、一致しない行の項目にはNULLが入れられます。

下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。

table name の要素
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
table address の要素
id address tel
1 横浜 01234567
2 川崎 98765432

SQLは下記になります。

表示結果は下記のように、2行目までは一致したすべての項目が入っている行と、一致しないカラムにNULLが入った3行目が返されます。

id name kana address tel
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 goto ゴトウ NULL NULL NULL

外部結合 RIGHT OUTER JOIN

外部結合のうち(RIGHT OUTER JOIN)という結合方法もあります。

これは、単純にLEFT OUTER JOINの逆で、条件式の右側にあるテーブルについては条件に一致するデータがすべて取り出されます。

そして、左側のテーブルは、一致する行についてはデータが埋められ、一致しない行にはNULLが埋められます。

下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。

table name の要素
id name kane
1 sato サトウ
2 saitou サイトウ
table address の要素
id address tel
1 横浜 01234567
2 川崎 98765432
3 浅草 10293847

SQLは下記になります。

表示結果は下記のように、2行目までは一致したすべての項目が入っている行と、一致しないカラムにNULLが入った3行目が返されます。

id name kana address tel
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 NULL NULL 浅草 10293847

 

外部結合 FULL OUTER JOIN

FULL OUTER JOINはLEFT OUTER JOINとRIGHT OUTER JOINを同時に行うイメージです。

一致する行に加え、条件式の左側にしかない行は右側にNULLが入った行が返される。そして、右側にしかない行は左側にNULLが入った行が返されます。

上記と同様、下記の二つのテーブルを結合する過程を見ていきます。

table name の要素
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
table address の要素
id address tel
1 横浜 01234567
2 川崎 98765432
4 浅草 10293847

SQLは下記になります。

表示結果は下記のように、2行目までは一致したすべての項目が返されます。そして、条件式の右側の項目にNULLが埋められた行と左側の項目にNULLがうめられた行が返されます。

上記の処理結果は下記の通りです。

id name kana address tel
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 goto ゴトウ NULL NULL
4 NULL NULL 浅草 10293847
メモ
FULL OUTER JOINはmysqlではエラーになります。

交差結合 CROSS JOIN

交差結合(CROSS JOIN)は特殊な結合です。

この結合は、二つのテーブルのすべての掛け合わせた行が返されます。

上記と同様、下記の二つのテーブルを結合する過程を見ていきます。

table name の要素
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
table address の要素
id address tel
1 横浜 01234567
2 川崎 98765432

SQLは下記になります。

表示結果は下記のように、nameテーブルとaddressテーブルの全ての組み合わせが結果として帰ります。

上記の処理結果は下記の通りです。

id name kana address tel
1 sato サトウ 横浜 01234567
1 sato サトウ 川崎 98765432
2 saitou サイトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 goto ゴトウ 横浜 01234567
3 goto ゴトウ 川崎 98765432

WHERE句のみで内部結合をする方法

sql-join-02

結合の際に、JOIN句を使わずにWHERE句のみで行うことができます。

機能としては同じ動作をしますが、WHERE句のみで完結します。しかし、結合条件が多かったりテーブル数が多くなると結合条件がどこなのかが分かりにくくなることがあります。

下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。

table name の要素
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
table address の要素
id address tel
1 横浜 01234567
2 川崎 98765432

SQLは下記になります。

表示結果は下記のように、2行目までは一致したすべての項目が入っている行と、一致しないカラムにNULLが入った3行目が返されます。

id name kana address tel
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
未経験・初心者向け「SQL鬼練1〜4」

まとめ

このように、結合の方法をいくつか見てきました。

SQLは意外と書き方の種類も多く、結合の順番などでパフォーマンスも変わることがあります。

できる限り多くの方法を知っておくのが良いです。

この記事がお役立ちいただければ幸いです。