プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】SELECT文 (外部結合) -6-

www.pon-x.jp

前回の続き

前回は内部結合の話でした。
結合には外部結合というのがあって、今回はこれを学びます。

外部結合

まず、内部結合のおさらいですが、内部結合はテーブル同士のキーをもとに、一致するレコードだけを抽出しました。
つまり、共通部分ということになります。
図にするとこんな感じです。
f:id:hanabusa-snow:20201121223300p:plain

一方で、外部結合は、左外部結合と右外部結合と完全外部結合があります。

左外部結合

→Aすべての要素に対して、AとBの共通部分のカラムをくっつけてあげる。 f:id:hanabusa-snow:20201121223304p:plain



右外部結合

→左外部結合の逆
f:id:hanabusa-snow:20201121223530p:plain



完全外部結合

→AとBすべてのレコードを抽出。ただし、共通するキーに対してはカラム同士を結合する。
f:id:hanabusa-snow:20201121223306p:plain



左外部結合

左外部結合と右外部結合は、書き順を入れ替えるだけなので左外部結合のみあつかいます。
Person.PersonとSales.PersonCreditCardを.BusinessEntityIDで結合します。

SELECT * 
FROM Person.Person PP
    LEFT JOIN Sales.PersonCreditCard PC
        ON  PP.BusinessEntityID = PC.BusinessEntityID

結果は以下の通り。
f:id:hanabusa-snow:20201121223250p:plain みてのとおり、Aのキーに対してBのキーが見つからないカラムは結合できないので、NULLで埋められる。

これを利用して、AにあってBにないレコードを抽出してみます。
つまりここの部分です。
f:id:hanabusa-snow:20201121224122p:plain

SQLを書いてみます。 WHERE句を加えるだけです。

SELECT * 
FROM Person.Person PP
    LEFT JOIN Sales.PersonCreditCard PC
        ON  PP.BusinessEntityID = PC.BusinessEntityID
WHERE PC.BusinessEntityID IS NULL

結果はこんな感じ。
854件だとわかりました。
f:id:hanabusa-snow:20201121223254p:plain

完全外部結合

完全外部結合は、AとBのすべてのレコードを含めてくれますが、キーが一致するレコードはまとめて1レコードにしてカラムにデータをまとめてくれます。

以下のように書いてみましょう。
結合キーは全く関係ないものですが、FULL JOINだとすべてのレコードを抽出してくれますので、それぞれのテーブルのレコードの和の分だけ出力されます。

SELECT * 
FROM Person.Person PP
    FULL JOIN Sales.PersonCreditCard PC
        ON  PP.BusinessEntityID = PC.CreditCardID

結果は以下の通り。
f:id:hanabusa-snow:20201121225054p:plain
20777件出力できました。







以上、今回はここまで。
次回もまだまだSELECTです。