0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WHERE 等価結合 / INNER JOIN / LEFT OUTER JOIN / RIGHT OUTER JOIN の違い @ MariaDB

Posted at

環境

  • MariaDB 10.3.29-MariaDB-0ubuntu0.20.04.1
  • Ubuntu 20.04 LTS

シノニム

  • JOIN → INNER JOIN
  • LEFT JOIN → LEFT OUTER JOIN
  • RIGHT JOIN → RIGHT OUTER JOIN

テストテーブル


MariaDB [test]> select * from 会員;
+----+-----------------+-----------+
| id | 漢字氏名        | ランク    |
+----+-----------------+-----------+
|  1 | 白き帝王        |        10 |
|  2 | 紅き小惑星      |         1 |
|  3 | 破壊連星        |         1 |
|  4 | 聖なる眼        |      NULL |
+----+-----------------+-----------+
4 rows in set (0.000 sec)

MariaDB [test]> SELECT * FROM ランク属性;
+-----------+--------------+
| ランク    | ランク名     |
+-----------+--------------+
|         1 | 下っ端       |
|        10 | 聖帝         |
|       100 | 神           |
+-----------+--------------+
3 rows in set (0.000 sec)

WHERE 等価結合 / INNER JOIN


MariaDB [test]> SELECT * FROM 会員,ランク属性 WHERE 会員.ランク=ランク属性.ラン ク;
+----+-----------------+-----------+-----------+--------------+
| id | 漢字氏名        | ランク    | ランク    | ランク名     |
+----+-----------------+-----------+-----------+--------------+
|  1 | 白き帝王        |        10 |        10 | 聖帝         |
|  2 | 紅き小惑星      |         1 |         1 | 下っ端       |
|  3 | 破壊連星        |         1 |         1 | 下っ端       |
+----+-----------------+-----------+-----------+--------------+
3 rows in set (0.001 sec)

MariaDB [test]> SELECT * FROM 会員 INNER JOIN ランク属性 ON 会員.ランク=ランク属性.ランク;
+----+-----------------+-----------+-----------+--------------+
| id | 漢字氏名        | ランク    | ランク    | ランク名     |
+----+-----------------+-----------+-----------+--------------+
|  1 | 白き帝王        |        10 |        10 | 聖帝         |
|  2 | 紅き小惑星      |         1 |         1 | 下っ端       |
|  3 | 破壊連星        |         1 |         1 | 下っ端       |
+----+-----------------+-----------+-----------+--------------+
3 rows in set (0.000 sec)

同じ結果ですね。

LEFT OUTER JOIN / RIGHT OUTER JOIN

主テーブルを全部表示。従テーブルに該当が無い場合はNULL表示。
LEFT / RIGHT は JOIN 句の左側が主テーブルか右側が主テーブルかの違い。


MariaDB [test]> SELECT * FROM 会員 LEFT OUTER JOIN ランク属性 ON 会員.ランク=ラ ンク属性.ランク;
+----+-----------------+-----------+-----------+--------------+
| id | 漢字氏名        | ランク    | ランク    | ランク名     |
+----+-----------------+-----------+-----------+--------------+
|  2 | 紅き小惑星      |         1 |         1 | 下っ端       |
|  3 | 破壊連星        |         1 |         1 | 下っ端       |
|  1 | 白き帝王        |        10 |        10 | 聖帝         |
|  4 | 聖なる眼        |      NULL |      NULL | NULL         |
+----+-----------------+-----------+-----------+--------------+
4 rows in set (0.001 sec)

JOIN 句より左側を主テーブルとし、主テーブルを全部表示。従テーブルに該当が無い場合はNULL表示。


MariaDB [test]> SELECT * FROM 会員 RIGHT OUTER JOIN ランク属性 ON 会員.ランク=ランク属性.ランク;
+------+-----------------+-----------+-----------+--------------+
| id   | 漢字氏名        | ランク    | ランク    | ランク名     |
+------+-----------------+-----------+-----------+--------------+
|    1 | 白き帝王        |        10 |        10 | 聖帝         |
|    2 | 紅き小惑星      |         1 |         1 | 下っ端       |
|    3 | 破壊連星        |         1 |         1 | 下っ端       |
| NULL | NULL            |      NULL |       100 | 神           |
+------+-----------------+-----------+-----------+--------------+
4 rows in set (0.000 sec)

JOIN 句より右側を主テーブルとし、主テーブルを全部表示。従テーブルに該当が無い場合はNULL表示。

テーブル位置を逆に


MariaDB [test]> SELECT * FROM ランク属性 RIGHT OUTER JOIN 会員 ON 会員.ランク=ランク属性.ランク;
+-----------+--------------+----+-----------------+-----------+
| ランク    | ランク名     | id | 漢字氏名        | ランク    |
+-----------+--------------+----+-----------------+-----------+
|         1 | 下っ端       |  2 | 紅き小惑星      |         1 |
|         1 | 下っ端       |  3 | 破壊連星        |         1 |
|        10 | 聖帝         |  1 | 白き帝王        |        10 |
|      NULL | NULL         |  4 | 聖なる眼        |      NULL |
+-----------+--------------+----+-----------------+-----------+
4 rows in set (0.000 sec)

MariaDB [test]> SELECT * FROM ランク属性 LEFT OUTER JOIN 会員 ON 会員.ランク=ラ ンク属性.ランク;
+-----------+--------------+------+-----------------+-----------+
| ランク    | ランク名     | id   | 漢字氏名        | ランク    |
+-----------+--------------+------+-----------------+-----------+
|        10 | 聖帝         |    1 | 白き帝王        |        10 |
|         1 | 下っ端       |    2 | 紅き小惑星      |         1 |
|         1 | 下っ端       |    3 | 破壊連星        |         1 |
|       100 | 神           | NULL | NULL            |      NULL |
+-----------+--------------+------+-----------------+-----------+
4 rows in set (0.001 sec)

テーブル位置を逆にしたうえで、LEFT/RIGHT を逆にすると(上記ではフィールド並びは異なりますが)先ほどと同じ結果が得られます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?