プログラ生活

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

【SQL Server(連載)】SELECT文 (内部結合) -5-

www.pon-x.jp

前回の続きです。
今回から複数のテーブルを結合して、SELECT文を書いてみたいと思います。

内部結合

テーブル同士を結合するとは、カラム同士で同じ値を持つレコードをつなげることをいいます。
このとき、内部結合と外部結合というのが代表的で、今回は内部結合の話です。

内部結合は、異なるテーブル同士で結合するカラムを指定して、お互いに存在するレコードをみつけだしつなげてくれます。

では、内部結合する前に2つのテーブルを確認してみましょう。
まずは、Person.PersonとPerson.PersonPhoneを比較します。
以下のようにSQLを書いてください。

SELECT * FROM Person.Person 

SELECT * FROM Person.PersonPhone

以下のように出力されます。

f:id:hanabusa-snow:20201120133355p:plain
2つのテーブルにはBusinessEntityIDというのがあり、このカラムをキーにして情報を結合することができます。
(※ちなみにテーブル同士を結合する際は、テーブル定義書という設計書をもとに結合しないと誤った解釈ででーたをつくってしまうことがあるので注意しましょう。)

では、上記のキーで内部結合をします。
内部結合はFROM句のあとに、INNER JOIN でテーブル名をかき、結合するキー(つまりカラム名)をONの後に書きます。
詳しくは以下の通り

SELECT *
FROM Person.Person PP
    INNER JOIN Person.PersonPhone PH
        ON PP.BusinessEntityID = PH.BusinessEntityID

結果は以下の通り
f:id:hanabusa-snow:20201120133217p:plain

エイリアスをつけるとコードがかきやすい。

上記のSQLで、テーブル名の後に何かついているのが気になったかと思います。
例えばこれ => Person.Person PP
このPPをエイリアスといって、あだ名をつけていると思ってください。

これの何がいいかというと、カラムを指定するときに便利になります。
ON句に以下の通り書いてありますね。 ON PP.BusinessEntityID = PH.BusinessEntityID

Person.PersonとPerson.PersonPhoneはお互いに同名のBusinessEntityIDというカラムをもっています。
このとき、テーブル名を指定して
ON Person.Person.BusinessEntityID = Person.PersonPhone.BusinessEntityID
とかいてもよいのですが、ながったらしいので上記で決めたエイリアスを活用すると、コードが短く済むというわけなのです。

結合できるテーブルは2個とは限らない

次に、うえで内部結合したものに、さらにもうひとつのテーブルを結合してみます。
さらに結合するテーブルはPerson.PhoneNumberTypeです。
まずは、テーブルを確認してみましょう。

SELECT *
FROM Person.Person PP
    INNER JOIN Person.PersonPhone PH
        ON PP.BusinessEntityID = PH.BusinessEntityID

SELECT * FROM Person.PhoneNumberType

f:id:hanabusa-snow:20201120133222p:plain

では、PhoneNumberTypeIDで結合してみようと思います。
SQLは以下の通り

SELECT 
    PP.BusinessEntityID,
    PhoneNumber,
    Name
FROM Person.Person PP
    INNER JOIN Person.PersonPhone PH
        ON PP.BusinessEntityID = PH.BusinessEntityID

    INNER JOIN Person.PhoneNumberType NP
        ON PH.PhoneNumberTypeID = NP.PhoneNumberTypeID 

以下の通り結合できました。 f:id:hanabusa-snow:20201120133231p:plain

ソートしてみよう

上記の出力は、並び順がなにも考慮されていません。
並び替えは、最後にORDER BY [カラム名]で行えます。

例えばこんな感じ

SELECT 
    PP.BusinessEntityID,
    PhoneNumber,
    Name
FROM Person.Person PP
    INNER JOIN Person.PersonPhone PH
        ON PP.BusinessEntityID = PH.BusinessEntityID

    INNER JOIN Person.PhoneNumberType NP
        ON PH.PhoneNumberTypeID = NP.PhoneNumberTypeID 
ORDER BY 
    BusinessEntityID

f:id:hanabusa-snow:20201120133235p:plain
BusinessEntityIDでソートすることができましたね。







以上、次回は外部結合を勉強します。