MySQLでINNER JOIN(内部結合)とOUTER JOIN(外部結合)

SQLと久し振りに向き合ったときに、内部結合「INNER JOIN」と、外部結合「LEFT JOIN」「RIGHT JOIN」ってどっちがどういう動きするんだっけ?と忘れていてしまったので、ざっくりですが、わかりやすくメモしておきます。

内部結合、INNER JOINに関して

AテーブルとBテーブルが結合できた場合に処理する
ので、結合先のBテーブルに値が存在しない場合は、FALSEです。

SELECT * FROM tableA as A INNER JOIN tableB as B ON A.id = B.aid;

※AとB両方に存在した場合に結果を取得

外部結合、OUTER JOINに関して

OUTER JOINは、「LEFT JOIN」「RIGHT JOIN」の2つある。
AテーブルとBテーブルが結合出来なくても処理する
ので、結合先のBテーブルに値が存在しない場合も処理を実行します。

ざっくりいうと、どっちのテーブルを中心に処理をするかです。
なので、中心となるテーブルをSQL文面上に最初に書く方がデータ構成を考えやすいので、大抵の場合は「LEFT JOIN」を使うケースが圧倒的に多いです。

SELECT * FROM tableA as A LEFT JOIN tableB as B ON A.id = B.aid;
※Aを中心に考えて、Bが存在しない場合も結果を取得
SELECT * FROM tableA as A RIGHT JOIN tableB as B ON A.id = B.aid;
※Bを中心に考えて、Aが存在しない場合も結果を取得

MySQLでDELETE時にJOINするやつ

意外と今まで使ってこなかった、DELETE時にJOINですが、
思った以上にハマってしまったので、備忘録として残します。

結論のSQLから

DELETE tbl1 FROM table_name1 AS tbl1 JOIN table_name2 AS tbl2 ON tbl1.id = tbl2.id WHERE tbl1.id = {:id}

複数テーブルを削除する

内部結合か外部結合かの判断は、上記の違いを踏まえた上で判断する。

DELETE A, B FROM tableA as A LEFT JOIN tableB as B ON A.id = B.aid WHERE A.flag = 0;
  • DELETEとFROMの間のテーブル名は必須!
  • ASを使うならDELETEとFROMのあいだのテーブル名はASで指定したテーブル名でなくてはならない!

プロに聞いてみる
株式会社adanはエンジニアのキャリアに真剣に向き合っています。
企業の情報エンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。