ITとdesign エンジニアのブログ by エンジ庭

IT業界のトレンドなどIT分野について学んだ事を書いていきます。プログラミング技術などについて現在Qiitaメインに書いてますので、そちらを参照ください。  https://qiita.com/kota_sho

SQL 結合編

2019-08-27

結合も集合演算子と同じようにテーブル同士をくっつけます。

集合演算子が行を足し合わせる(テーブル同士を上下にくっつける)に対し、

結合は列をくっつけます(テーブル同士を横にくっつける)。

 

結合の種類:

内部結合  INNER JOIN

左外部結合    LEFT OUTER JOIN

右内部結合    RIGHT OUTER JOIN

完全外部結合   FULL OUTER JOIN

自己結合

 

SELECT 選択列

FROM テーブル

JOIN 結合するテーブル ON

結合条件 = 結合条件

 

内部結合  INNER JOIN

両方のテーブルの結合条件に一致する行だけ取得します。

SELECT TS.tenpo_id, TS.tenpo_mei, TS.shohin_id, S.shohin_mei, s.hanbai_tanka
FROM TenpoShohin AS TS INNER JOIN Shohin AS S
ON TS.shohin_id = S.shohin_id;

訳:

TenpoShohin(TSと呼ぶことにし)とShohin(Sと呼ぶことにし)を結合する。

そのため、結合条件としてTSのshohin_idとSのshohin_idを紐づける。

内部結合に関わらず、どの結合方法も基本的には流れは同じです。

INNER JOINにするか OUTER JOINにするかという違いです。

 

外部結合 OUTER JOIN

内部とは反対に、外部は全行を取得します。

左外部結合は左のテーブルを基準とし、結合されるもう一方のテーブルは左テーブルと一致するレコードのみ取得されます。

右外部結合はその逆となります。

書き方は基本、内部結合と変わりませんし、左か右かもLEFTかRIGHTにするだけです。

SELECT TS.tenpo_id, TS.tenpo_mei, TS.shohin_id, S.shohin_mei, s.hanbai_tanka
FROM TenpoShohin AS TS LEFT OUTER JOIN Shohin AS S
ON TS.shohin_id = S.shohin_id;

 

完全外部結合 FULL OUTER JOIN

両方のテーブルどちらも優先で、結合条件で一致するレコード、一致しないレコード全てを取得します。

 
SELECT TS.tenpo_id, TS.tenpo_mei, TS.shohin_id, S.shohin_mei, s.hanbai_tanka
FROM TenpoShohin AS TS FULL OUTER JOIN Shohin AS S
ON TS.shohin_id = S.shohin_id;

 

 

自己結合

上記では結合は2つのテーブルを結合してましたが、内部結合では1つのテーブルの中で結合します。検索したいものを、1つのテーブル内の情報を組み合わせて探し出します。

SELECT 選択列

FROM テーブル AS テーブル1

JOIN テーブル AS テーブル 2 ON

(テーブル1.項目 = テーブル2.項目)

SELECT staff.id AS id,
staff.name AS 名前,
boss.name AS 上司名
FROM staff
JOIN staff AS boss ON
(staff.boss = boss.id)

 

会社の組織のなかで、自分の上司は会社内の人ですし、同じく自分の部下も会社内の人です。つまりテーブルに全メンバーがいれば、もう一つ同じテーブルを用意し、メンバー同士の関係性を組み合わせれば上司は誰かということが導き出されます。プロセス上もう一つのテーブルを作りますが、実態は、一つのテーブル内の情報で検索が完結できるということです。