仕事でDB作って早一ヶ月程ですが、レコード数が既に1500件。
こんなに増えてる今でも問題点に気付いて直したり、分析用に集計出したりとやってます。なう。
そして今日は満を持して!テーブルの結合・連結について。
詳しく考えずにテーブル結合していましたが、欲しい結果と違う結合をしていたようです。
結合って沢山あるっぽいよね?正直、違いが分かっていなかった(・ε・)
これまで私がしていた結合は、
条件(テーブルとテーブルの共通のキー)を書いていただけ=等価結合(または内部結合・INNER JOIN)というらしい。
今回気付いた所は、条件(テーブルとテーブルの共通のキー)でNULL(該当値がない)場合は結果に表示されないというトコロでした。
PHPで登録フォーム作っていて、DBから登録できる値を読み込んでいたので実際にはNULLになることはないんだけど、
ふと気になって意図的にphpMyAdminでNULLで登録したら、出てこなかったんデスヨ...(´・ω・`) ショボーン
全部表示させる結合の事を、
左結合・右結合、外部結合、
left join・right join、
left outer join・right outer join
というらしい。
言い方は違えど、動作は全部一緒。
分かりやすくまとめてみた!
まず、ここでサンプルのテーブル。
categoryテーブルのid と bandテーブルのcat_id をキーとして結合ます。
ゴールデンボンバーがPOPなのかどうかという問題は置いといてください★
◆category
-----------------------
id | name
-----------------------
1 | ROCK
2 | POP
3 | IDOL
4 | V-ROCK
-----------------------
◆band
-----------------------------------------
id | band_name | cat_id
-----------------------------------------
1 | ONE OK ROCK | 1
2 | ゴールデンボンバー | 2
3 | 嵐 | 3
4 | 電気グルーブ | 5
-----------------------------------------
結合の構文と、その違い
左結合・右結合(または外部結合) | 等価結合(または内部結合) | |
---|---|---|
違い | 全部表示 (値がNULLも表示) |
データがあるレコードだけ表示 (NULLは含まれない) |
構文 | left join ・ right join・ left outer join・right outer join |
INNER JOIN または、 WHERE句で条件(=でつなぐ)入れる |
SQL文サンプル | SELECT band.id, band_name, name FROM band LEFT JOIN category ON band.cat_id=category.id; |
SELECT band.id, band_name, name FROM band,category WHERE band.cat_id=category.id;
または SELECT |
結果 |
左結合・右結合の違いは?
構文のleft joinの直前(左側)・直後(右側)に記述するテーブル、どちらを主とするか、です。
テーブルA left join テーブルB ・・・テーブルAを主とする
テーブルA right join テーブルB ・・・テーブルBを主とする
【参考サイト】
http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/mysql_09.htm|MySQL 編9 - 表結合(join)、単純結合、等価結合、外部結合、再帰結合 - SAK Streets