MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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」のキーワードを必ず明示的に記述するようにしましょう。

  1. MySQLで予約語「Key」をカラム名として使用する方法【バッククォートの使い方】

    MySQLでは「Key」は予約語(予約済みキーワード)として登録されているため、そのままカラム名として使用するとエラーが発生します。そこで活躍するのがバッククォート(`)です。カラム名の前後をバッククォートで囲むことで、予約語でも安全に使用できるようになります。本記事では、実際にカラム名「key」を持つテーブルを作成する例を通じて、具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、バッククォートで囲んだ「Key」というカラムを持つテーブルを作成しましょう。mysql> create table DemoTable ( `Key` int ); Query OK,

  2. MySQLでテーブルに存在しない値だけを抽出する方法(UNION ALLとNOT EXISTSの活用)

    MySQLでテーブルに存在しない値を照会するには? MySQLで「テーブルにまだ登録されていない値だけ」を取得したい場合、UNION ALLとWHERE NOT EXISTSを組み合わせるのが有効です。サブクエリで候補となる値をUNION ALLで列挙し、NOT EXISTSによって既にテーブル内に存在する値を除外することで、存在しない値のみを抽出できます。 ここでは、実際の手順をサンプルコードとともに解説します。 1. サンプルテーブルを作成する まず、自動採番(AUTO_INCREMENT)のカラムを持つテーブルを作成します。 mysql> create table DemoTab