【mySQL】結合を自分なりにまとめてみた。

  • このエントリーをはてなブックマークに追加

仕事で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
band.id, band_name, name
FROM band
INNER JOIN category
WHERE band.cat_id=category.id;
結果
left join・right join・外部結合 の結果。NULLの行が表示されてます。

left join・right join・外部結合 の結果

inner join・内部結合 の結果。NULLの行がありません!表示されていません!

inner join・内部結合 の結果




左結合・右結合の違いは?

構文のleft joinの直前(左側)・直後(右側)に記述するテーブル、どちらを主とするか、です。
テーブルA left join テーブルB ・・・テーブルAを主とする
テーブルA right join テーブルB ・・・テーブルBを主とする



【参考サイト】
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_09.htm|MySQL 編9 – 表結合(join)、単純結合、等価結合、外部結合、再帰結合 – SAK Streets

Leave a Reply

  • (will not be published)

CAPTCHA