SELECT文 – テーブルの結合

テーブルの結合


はじめに


今度は、 合わせ技 です。
ここでは、よく使うテーブルの結合について紹介します。
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) のように記述可能です。
(冗長な書き方になるので、あまり見ない書き方かなと思います。

出くわした際には、混乱することが無いよう覚えておくとよいでしょう!

カテゴリー

アーカイブ

Close Bitnami banner
Bitnami