SQL

SQL – 異なるテーブルの結合

0

SQLでは複数テーブルに分けて格納されたデータを同時に取り出すことができる。
これを「結合」という。

テーブルを作成する際に、DB設計の段階で正規化等のプロセスを経て、テーブルを複数に分けることがある。それはデータベースの視点で見ると、データが分割されていた方がデータを安全かつ確実かつ早く扱いやすいから
ちょっと話は反れるけど、EXCELで表を作るときも、1つの表に情報(列)を入れすぎると、画面を横にスクロールしたり、画面の縮尺を小さくしないと表全体が見れなくなったりと、使い勝手がかなり悪くなった記憶が。
そんなとき、確かに表を分けたりして工夫してたなーとか思い出した。SQLではそんな分けた表たちを見やすくするために簡単に結合できるらしい。これは色々なことに使えそうな予感が。。。

テーブルの結合

基本的な使い方

以下、結合のイメージ図。あくまでFROM句の主となる家計簿テーブルに、費目テーブルを結合している。

(JOIN)ONの条件を満たす結合相手が見つからない場合

例えば、家計簿テーブルの費目IDが4なのに、リレーションシップを築いている費目テーブルにはID=4という行がない場合。結合後、家計簿テーブルの費目IDが4を含む行は強制削除されてしまう。このような結合を内部結合(INNER JOIN)という。

強制削除されてしまうと、結合データをもとに集計作業をしたりするときは困るので、削除されないようにしたい。。。

左外部結合(LEFT JOIN)

左外部結合を使えば、費目テーブルに費目ID=4があろうが、それがNULLであろうが、家計簿テーブルの行を強制削除することなく、結合することができる。

これと同じように
■右外部結合(RIGHT JOIN)⇒費目テーブルの全行を必ず出力
■完全外部結合(FULL JOIN)⇒家計簿テーブルも費目テーブルも全行を必ず出力
もある。

結合するテーブルが3つ以上になっても書き方や考え方は同じで、記述したSQL文の上から順番に結合されていく。このように結合条件が合わなくても行を削除することなく結合することを、外部結合(OUTER JOIN)という。

その他の構文

テーブル名を指定

副問い合わせの結果と結合

外部結合の使い方

繰り返し項目を1列にまとめる

上記のような、DB設計において正規化をしていない困ったテーブルをあるべき姿に変換する

クロス表で入れ子の表側を作る

ここからは、達人に学ぶSQL指南書のサンプルコードを一部お借りして、まとめたいと思います。

SQL文

上記のSQL文でも問題なく動くが、途中のインラインビュー(中間テーブル)を削除することで、パフォーマンスを上げることができる。ビューについては、こちらを参照。

上記のSQL文は、クロス結合で作成したMASTER(テーブル)とTblPop(DATA)が「一対多」の関係にあるため、これらを結合しても、得られる表の行数は変わらないため、中間ビューは作らないようにしている。なので、先にMASTERの中間ビューを作ってそこから参照する一つ目の記述よりも処理手順が減るので、パフォーマンスが上がる。
結合元と結合先のテーブルが「一対一」あるいは「一対多」の関係になっていれば、上記のような記述が可能になる。

0
ABOUT ME
chopes
前職では、人材業界で法人営業・キャリアアドバイザー・大阪責任者をしていました。他にも、新入社員の研修策定と育成、面談者の集客におけるスカウト業務や中途採用の面接官、新卒採用の2次選考官、インターンシップのメンターとしてプログラムに参加していました。退職後は、未経験でエンジニアになるためにスクールに通学して勉強。2ヶ月の転職活動を経て、今春からRailsエンジニアとして第二のキャリアを歩むことになりました。主に学習記録や未経験エンジニアについてアウトプットしていきたいと思います! 以下、Twitterアカウントですので、気軽にフォローしてください! Twitter:@chopesu_se