MySQLでJOINクエリから「RIGHT」や「LEFT」のキーワードを省略するとどうなる?INNER JOINとして扱われる理由を解説
はじめに:キーワードを省略したJOINクエリの挙動
MySQLでは、RIGHT JOINまたはLEFT JOINのクエリを記述する際に、キーワード「RIGHT」や「LEFT」を省略した場合、どちらの場合でもそのクエリはINNER JOIN(内部結合)として処理され、結果が返されます。
これは、RIGHT JOIN、LEFT JOIN、そしてINNER JOINの違いが実質的に「RIGHT」または「LEFT」というキーワードの有無だけだからです。キーワードを書かなければ、MySQLは通常の内部結合として解釈します。
この動作を理解するために、「tbl_1」と「tbl_2」という2つのテーブルを例に見ていきましょう。それぞれ以下のデータを持っています。
mysql> Select * from tbl_1; +----+--------+ | Id | Name | +----+--------+ | 1 | Gaurav | | 2 | Rahul | | 3 | Raman | | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from tbl_2; +----+---------+ | Id | Name | +----+---------+ | A | Aarav | | B | Mohan | | C | Jai | | D | Harshit | +----+---------+ 4 rows in set (0.00 sec)
RIGHT JOINの場合
まず、キーワード「RIGHT」を使用したRIGHT JOINのクエリは次のように記述できます。
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 RIGHT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +------+----+ | id | id | +------+----+ | 4 | A | | NULL | B | | NULL | C | | NULL | D | +------+----+ 4 rows in set (0.00 sec)
RIGHT JOINでは右側のテーブル(tbl_2)のすべての行が保持され、左側のテーブル(tbl_1)に一致する行がない場合はNULLが返されるため、4行の結果が得られます。
「RIGHT」を省略した場合
次に、同じクエリからキーワード「RIGHT」を取り除いて実行してみます。
mysql> Select tbl_1.id,tbl_2.id FROM tbl_1 JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+----+ | id | id | +----+----+ | 4 | A | +----+----+ 1 row in set (0.00 sec)
この結果セットからわかるように、キーワード「RIGHT」を使わないと、MySQLはこのクエリをINNER JOINとして解釈し、両テーブルに一致する行だけを返します。そのため、一致するのは「Aarav」の1行のみとなり、結果は1行になります。
LEFT JOINの場合
同様に、キーワード「LEFT」を使用したLEFT JOINのクエリは次のようになります。
mysql> SELECT tbl_1.id,tbl_2.id FROM tbl_1 LEFT JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+------+ | id | id | +----+------+ | 1 | NULL | | 2 | NULL | | 3 | NULL | | 4 | A | +----+------+ 4 rows in set (0.02 sec)
LEFT JOINでは左側のテーブル(tbl_1)のすべての行が保持され、右側のテーブル(tbl_2)に一致する行がない場合にはNULLが返されます。そのため、ここでも4行の結果が得られています。
「LEFT」を省略した場合
続いて、キーワード「LEFT」を取り除いたクエリを実行します。
mysql> Select tbl_1.id,tbl_2.id FROM tbl_1 JOIN tbl_2 ON tbl_1.name = tbl_2.name; +----+----+ | id | id | +----+----+ | 4 | A | +----+----+ 1 row in set (0.00 sec)
この結果からも、キーワード「LEFT」を使わなかった場合、MySQLはこのクエリをINNER JOINとして処理し、両テーブルで名前が一致する行のみを返していることが確認できます。
まとめ
RIGHT JOINやLEFT JOINのクエリから「RIGHT」「LEFT」のキーワードを省略すると、MySQLはそれを単なるJOIN、すなわちINNER JOINとして扱います。外部結合(アウタージョイン)の特性である「一致しない行もNULL付きで返す」という動作は失われ、両テーブルに一致する行だけが結果として返されます。
意図せずキーワードを書き忘れると、期待していた結果セットと異なるデータしか取得できなくなるため、外部結合を行いたい場合は「RIGHT」や「LEFT」のキーワードを必ず明示的に記述するようにしましょう。
-
MySQLで予約語「Key」をカラム名として使用する方法【バッククォートの使い方】
MySQLでは「Key」は予約語(予約済みキーワード)として登録されているため、そのままカラム名として使用するとエラーが発生します。そこで活躍するのがバッククォート(`)です。カラム名の前後をバッククォートで囲むことで、予約語でも安全に使用できるようになります。本記事では、実際にカラム名「key」を持つテーブルを作成する例を通じて、具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、バッククォートで囲んだ「Key」というカラムを持つテーブルを作成しましょう。mysql> create table DemoTable ( `Key` int ); Query OK,
-
MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)
MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab