データベースにアクセスするためのSQLを学ぶ時に
と考えたことはないでしょうか。
ここでは、SQLの結合方法をいくつかみていきます。
目次
SQLで表同士を結合する方法
SQLで表同士を結合するときの種類は5つあります。
内部結合 INNER JOIN
内部結合(INNER JOIN)は最もオーソドックスな結合方法です。
結合するテーブルの条件が一致するレコードのみ出力されます。
下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
id address tel
1 横浜 01234567
2 川崎 98765432
SQLは下記になります。
1 2 3 4 |
select * from name t1 join address t2 on t1.id = t2.id; |
表示結果は下記のように、id同士が一致した行のみが表示されます。
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
外部結合 LEFT OUTER JOIN
外部結合のうち(LEFT OUTER JOIN)もよく使われるSQLです。
この場合、条件式の左側のテーブルの対象レコードは全て表示されます。右側のテーブルは、条件が一致した行のみ表示され、一致しない行の項目にはNULLが入れられます。
下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
id address tel
1 横浜 01234567
2 川崎 98765432
SQLは下記になります。
1 2 3 4 |
select * from name t1 full outer join address t2 on t1.id = t2.id; |
表示結果は下記のように、2行目までは一致したすべての項目が入っている行と、一致しないカラムにNULLが入った3行目が返されます。
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 goto ゴトウ NULL NULL NULL
外部結合 RIGHT OUTER JOIN
外部結合のうち(RIGHT OUTER JOIN)という結合方法もあります。
これは、単純にLEFT OUTER JOINの逆で、条件式の右側にあるテーブルについては条件に一致するデータがすべて取り出されます。
そして、左側のテーブルは、一致する行についてはデータが埋められ、一致しない行にはNULLが埋められます。
下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。
id name kane
1 sato サトウ
2 saitou サイトウ
id address tel
1 横浜 01234567
2 川崎 98765432
3 浅草 10293847
SQLは下記になります。
1 2 3 4 |
select * from name t1 right outer join address t2 on t1.id = t2.id; |
表示結果は下記のように、2行目までは一致したすべての項目が入っている行と、一致しないカラムにNULLが入った3行目が返されます。
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 NULL NULL 浅草 10293847
外部結合 FULL OUTER JOIN
FULL OUTER JOINはLEFT OUTER JOINとRIGHT OUTER JOINを同時に行うイメージです。
一致する行に加え、条件式の左側にしかない行は右側にNULLが入った行が返される。そして、右側にしかない行は左側にNULLが入った行が返されます。
上記と同様、下記の二つのテーブルを結合する過程を見ていきます。
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
id address tel
1 横浜 01234567
2 川崎 98765432
4 浅草 10293847
SQLは下記になります。
1 2 3 4 |
select * from name t1 full outer join address t2 on t1.id = t2.id; |
表示結果は下記のように、2行目までは一致したすべての項目が返されます。そして、条件式の右側の項目にNULLが埋められた行と左側の項目にNULLがうめられた行が返されます。
上記の処理結果は下記の通りです。
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 goto ゴトウ NULL NULL
4 NULL NULL 浅草 10293847
交差結合 CROSS JOIN
交差結合(CROSS JOIN)は特殊な結合です。
この結合は、二つのテーブルのすべての掛け合わせた行が返されます。
上記と同様、下記の二つのテーブルを結合する過程を見ていきます。
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
id address tel
1 横浜 01234567
2 川崎 98765432
SQLは下記になります。
1 2 3 |
select * from name cross join address |
表示結果は下記のように、nameテーブルとaddressテーブルの全ての組み合わせが結果として帰ります。
上記の処理結果は下記の通りです。
1 sato サトウ 横浜 01234567
1 sato サトウ 川崎 98765432
2 saitou サイトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
3 goto ゴトウ 横浜 01234567
3 goto ゴトウ 川崎 98765432
WHERE句のみで内部結合をする方法
結合の際に、JOIN句を使わずにWHERE句のみで行うことができます。
機能としては同じ動作をしますが、WHERE句のみで完結します。しかし、結合条件が多かったりテーブル数が多くなると結合条件がどこなのかが分かりにくくなることがあります。
下記のようなname、addressというテーブルが二つあるとして、これを結合するSQLを見ていきます。
id name kane
1 sato サトウ
2 saitou サイトウ
3 goto ゴトウ
id address tel
1 横浜 01234567
2 川崎 98765432
SQLは下記になります。
1 2 3 |
select * from name t1,address t2 where t1.id = t2.id |
表示結果は下記のように、2行目までは一致したすべての項目が入っている行と、一致しないカラムにNULLが入った3行目が返されます。
1 sato サトウ 横浜 01234567
2 saitou サイトウ 川崎 98765432
まとめ
このように、結合の方法をいくつか見てきました。
SQLは意外と書き方の種類も多く、結合の順番などでパフォーマンスも変わることがあります。
できる限り多くの方法を知っておくのが良いです。
この記事がお役立ちいただければ幸いです。