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で指定したテーブル名でなくてはならない!