skillup

技術ブログ

Database

外部結合 応用編2

投稿日:

引き続き結合についてです。

1対Nの結合に関して

下記のようなテーブルが2つあり、商品ごとの売上のサマリーを出したいとします。

items
item_no | item
———+——
10 | FD
20 | CD-R
30 | MO
40 | DVD

SalesHistory
sale_date | item_no | quantity
————+———+———-
2007-10-01 | 10 | 4
2007-10-01 | 20 | 10
2007-10-01 | 30 | 3
2007-10-03 | 10 | 32
2007-10-03 | 30 | 12
2007-10-04 | 20 | 22
2007-10-04 | 30 | 7

ここから下記のような表を作ることを考えます。

item_no | item | sum_quant
———+——+———–
30 | MO | 22
20 | CD-R | 32
10 | FD | 36
40 | DVD |

これを作り出すSQLは下記のようになります。

ただしこれは中間テーブル的なものを作っているのでパフォーマンスに若干の問題があります。
この場合、マスタのitemsに明細をつなぎ、あとからグルーピングすれば行数は増えません。

結合は一対一でなくても一対多なら行数は増えない、ということを覚えておきましょう。

完全外部結合

JOINで使うものはほとんどがINNER JOINかLEFT JOINでした。RIGHT JOINに関してはそもそも結合させる側をどちらに持ってくるかで変わってくるため、ほとんどつかいませんでした。

LEFT OUTER JOINですが、使ってませんし、理解もあまりしておりませんでした。これを機にしっかり理解しておこうと思っております。

まずは具体例から見ていきましょう。

下記のような2つのテーブル(class_a,class_b)があるとします。

id | name
—-+——–
1 | 田中
2 | 鈴木
3 | 伊集院

id | name
—-+——–
1 | 田中
2 | 鈴木
4 | 西園寺

id | name | name
—-+——–+——–
1 | 田中 | 田中
2 | 鈴木 | 鈴木
3 | 伊集院 |
4 | | 西園寺

外部結合とはこの場合、class_aとclass_bの和集合を求めていることになります。(ベン図を書くとわかりやすいかも。)

COLALESCEは可変個の引数をとって、NULL出ないものを出力する標準関数です。

また完全外部結合が存在しないデータベースもありますので、その場合はLEFT JOINを使ってUNIONでテーブル同士をつなげます。

次にそれぞれ結合により下記のケースを求めてみましょう。

差集合(class_aだけに存在するものとclass_bだけに存在するもの)

class_aのみ

class_bのみ

片方だけに存在しているものの抽出

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

オプティマイザと実行計画

データベースがSQLを受け取って処理を実行する前には下記のような段階があります。 Contents1 パーサー2 オプティマイザ3 カタログマネージャー4 テーブルからデータの取得5 参考リンク パー …

no image

MySQLのセキュアな設定

以前SSHの設定についていろいろ書いたんで今回はMySQLに関して。 Contents1 基本的な処方箋(MySQLに限らないかも)2 ホストのアクセスを制限する3 LOCAL INFILEコマンドを …

no image

SQL問題

今までやったSQL問題などのまとめ。定期的にやる予定です・・ 自分用なのでテーブルデータとかあったりなかったりいい加減です(汗) SQLドリル 問題1 nameとageで構成されたテーブルがあるとして …

no image

cakePHPでのマイグレーション

開発を続けているとデータベースのカラムの構造が変更するってことはしょっちゅうですが、管理がいい加減だとメンバー間でテーブルの構造が変わっていたり、本番と開発で違ってくるなどのトラブルが続出します。 そ …

no image

データベースのインデックスについて

今回はデータベースのインデックスに関して。 検索条件を早くする場合、何よりも速度が速くなるのはインデックスを張ることでしょう。 インデックスを張ることは単語を索引順に並べることですので、劇的に速度が向 …