mySQL

【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://sak.cool.coocan.jp/w_sak3/doc/sysbrd/mysql_09.htm|MySQL 編9 - 表結合(join)、単純結合、等価結合、外部結合、再帰結合 - SAK Streets

  • この記事を書いた人

サオリサン

WEB制作のディレクター・制作・運営支援をしてます(フリーランス&会社員)。アクセス解析してサイト改善するのが好き。

-mySQL
-,