テーブルの結合
はじめに
今度は、 合わせ技 です。
ここでは、よく使うテーブルの結合について紹介します。
DBからデータを取り出す際、「◯◯から☓☓を取り出す」といった選択を行っているかと思います。
そしてこのデータ取り出しの際、複数テーブルからデータを検索して取得するといったケースも多々あるかと思います。
ですが、例えばAとBというテーブルに対して、「Aを調べる⇒Bを調べる⇒2つの検索結果をがっちゃんこ」
なんてしてると時間がかかりますよね?
なので通常の検索の場合、「AとBのテーブルをまとめる⇒そこから検索」という方法を取ります。
この「 まとめる 」ことを「 結合 」と呼び、その方法として、今から取り扱う
内部結合や外部結合などといったものが存在しています。
テーブル結合について学んでいきましょう!
Step1 : テーブルの結合
今回は、駅の名前と路線名を扱う2つのテーブル(stationテーブルと、routeテーブル)を扱いながら、
その結合方法に関して追っていきます。
まずはテーブルを準備しますので、下記のSQL文を実行してください。
CREATE TABLE station( id SERIAL, station_name varchar(50), route_id integer); CREATE TABLE route( route_id integer not null, route_name varchar(50));
これで stationテーブルと、routeテーブル ができました。
※上記のテーブルは、このページでのみ使用します。
続いて、データを挿入していきます。
下記のSQL文を実行してください。
INSERT INTO station (station_name, route_id) VALUES ('Kamata', 1); INSERT INTO station (station_name, route_id) VALUES ('Shibuya', 2); INSERT INTO station (station_name, route_id) VALUES ('Shinjuku', 3); INSERT INTO station (station_name, route_id) VALUES ('Akihabara', 4); INSERT INTO route (route_id, route_name) VALUES (1, 'KehinTohokuSen'); INSERT INTO route (route_id, route_name) VALUES (2, 'YamanoteSen'); INSERT INTO route (route_id, route_name) VALUES (5, 'HibiyaSen');
これで、2つのテーブルにデータが挿入されました。
データが入っているか確認していきましょう。
【stationテーブル】
SELECT * FROM station;
入ってましたか?
続いて、
【routeテーブル】
SELECT * FROM route;
さて、データが入っていることも確認できたので、結合について学んでいきます!
内部結合
上でも言ったように、結合は、2つ以上のテーブルをくっつけることです。
SELECT文は知ってますね?
SELECT文で取得したデータの各レコード(行)の後ろにくっつけたいテーブルのデータを
くっつけます。
ただ、くっつけるにも条件が必要なので、この条件でくっつけてね。っていう書き方をします。
【基本構文】
SELECT * FROM 《メインのテーブル》 JOIN 《くっつけたいテーブル》 ON 《メインテーブルのカラム》 = 《くっつけたいテーブルのカラム》;
ちなみに、ONの後ろが条件です。
それでは実際のデータを使ってみてみましょう。
SELECT * FROM station JOIN route ON station.route_id = route.route_id
なんとなく使い方はわかりましたか?
JOINは内部結合といって、条件にあるstationテーブルのstation_idとrouteテーブルのroute_id
どちらもあるデータが取得されます。
なので、画像のようにどちらのテーブルにもないデータは取得されません。
左外部結合
結合の基本はなんとなくわかったと思います。
左外部結合では LEFT JOIN を使います。
特徴は、メインのテーブルのデータは全部表示して、条件に対応した
くっつけたいテーブルのデータは空白で表示するということです。
実際に見ていきましょう。
SELECT * FROM station LEFT JOIN route ON station.route_id = route.route_id
画像を見たら意味がわかるのではないでしょうか。
LEFT JOIN から見て左のテーブルは全部表示しますよ。という結合です。
右外部結合
最後に、右外部結合について説明します。
右外部結合では RIGHT JOIN を使います。
これは、左外部結合の逆で、
RIGHT JOIN から見て右のテーブルは全部表示しますよ。という結合です。
実際に使っていきましょう。
SELECT * FROM station RIGHT JOIN route ON station.route_id = route.route_id
画像のように表示されましたでしょうか。
- 内部結合
- 左外部結合
- 右外部結合
しっかり理解していきましょう。
補足
実は各JOINの名称は省略されており、正式名称ではありません。
今後、現場に出た際に正式名称に出くわす場面もあるかもしれないので、補足として付け加えておきます。
- JOIN
- INNER JOIN
- OUTER JOIN
- LEFT JOIN = LEFT OUTER JOIN
- RIGHT JOIN = LEFT OUTER JOIN
JOIN
の 正式な書き方は INNER JOIN
となります。
実際のSQLを記述する際には、 JOIN(or INNER JOIN)
どちらでも構いません。
「 この結合は内部結合ですよ 」という意味合いを含ませたい場合は、
INNER JOIN
としておけば可読性という面で優しい作りかなと思います。
また、外部結合の LEFT/RIGHT JOIN
も、
大きなくくりとして OUTER JOIN
となっています。
こちらも同様に LEFT/RIGHT JOIN(or LEFT/RIGHT OUTER JOIN)
のように記述可能です。
(冗長な書き方になるので、あまり見ない書き方かなと思います。
出くわした際には、混乱することが無いよう覚えておくとよいでしょう!