🗂

[SQL] ANSI JOIN文法

2024/11/27に公開

私はスクールを通じてデータベースをMariaDBで学び始めました。今もまだMariaDBを使っていますが、今後はおそらくOracleやMySQLなどをもっと使うでしょう。

MariaDBはMySQLのアップグレード版と言われているので、MySQLにすぐに適応できそうです。何よりもデータベース初心者なので…何でも早く適応できると思います(笑)。

とにかく今日は、こういう悩みなしに(?)DBMSの種類に関係なく使える文法を紹介します。

ANSI 文法

ANSI文法とは?
アメリカ国家標準協会が、異なるDBMS(Oracle、MariaDBなど)で共通して使用できるように考案した標準SQL文法を指します。
その中でもJOIN文法を見ていきます。

JOINの種類

  • INNER JOIN
  • OUTER JOIN
  • FULL OUTER JOIN

FULL OUTER JOINはマリアDBでは使用されません。
*MARIADBはMYSQL文法をほとんどすべて使用できます!

JOIN이라고 하면 통상적으로 INNER JOINを表す。

~~ MARIADBでよく使うINNER JOIN文法~~

SELECT STU.STU_NUM, STU_NAME, SCORE 
FROM JOIN_STU STU, JOIN_SCORE SCORE
WHERE STU.STU_NUM = SCORE.STU_NUM;

非常に簡単に作成できます😀
fromには照会するテーブルをすべて記述し、whereには結合する条件を設定すれば良い(2つのテーブルに共通して存在するカラムが必要です)。

結合条件を記述し、他の条件も追加したい場合はandを使って追加できます。

ANSI文法 - INNER JOIN -

ジョインはDBMSによってそれぞれの文法が存在します。

しかし、ANSI文法を使用すれば、すべてのDB環境で共通して使用できます。

ANSI文法を使ってINNER JOINを書く方法

  • INNER JOIN : 結合するテーブル
  • ON : 結合条件
  • 一般条件はON句の後、WHERE句に記述すればよい。
SELECT STU.STU_NUM, STU_NAME, SCORE 
FROM JOIN_STU STU INNER JOIN JOIN_SCORE SCORE
ON STU.STU_NUM = SCORE.STU_NUM;

⭐推奨事項)INNER JOINはJOINとして使用可能です。

ANS文法 - OUTER JOIN -

テーブル同士をジョインする際、片方にのみデータがある場合、データがあるテーブルの内容をすべて出力できる機能です。→ ジョイン条件が一致しなくても、該当データをすべて出力可能です。

<下記参照テーブル>
学生テーブルの学生番号 1~6 / スコアテーブルの学生番号 1,2,5,6,7,8

⭐INNER JOIN (ジョイン)の場合、1、2、5、6のみ出力されます → 共通部分に該当する値のみ出力されます。

OUTER JOIN의 종류

  • LEFT OUTER JOIN
  • RIGHT OUTER JOIN

左側と右側はクエリを書くときの順序によって判断される

OUTER JOINの使い方

例) OUTER JOIN を使用してすべての学生の情報を取得

RIGHT OUTER JOIN : クエリ基準の右側のテーブルの情報をすべて出力したいとき
LEFT OUTER JOIN : クエリ基準の左側のテーブルの情報をすべて出力したいとき
ON : ジョイン条件
IFNULL : 一方にのみデータがある場合、値は NULL になるため、NULL でないもので置き換えたい場合に使用します!

SELECT STU.STU_NUM, STU_NAME, IFNULL(SCORE,0) AS SCORE 
FROM JOIN_STU STU LEFT OUTER JOIN JOIN_SCORE SCORE
ON STU.STU_NUM = SCORE.STU_NUM;

<クエリ文>

<結果>

参考までにRIGHT OUTER JOINで照会した場合

😵‍💫 Oracleで使用可能なOUTER JOIN文法

MariaDBでは、以下のようにJOIN文法は可能ですが、OUTER JOINは不可能です。しかし、Oracleでは使用できます!!!!!!!!!!

(+) もっと見る ^^

SELECT STU.STU_NUM, STU_NAME, SCORE 
FROM JOIN_STU STU, JOIN_SCORE SCORE
WHERE STU.STU_NUM = SCORE.STU_NUM;  -- INNER JOIN

WHERE STU.STU_NUM = SCORE.STU_NUM(+);  -- LEFT OUTER JOIN

WHERE STU.STU_NUM(+) = SCORE.STU_NUM;  -- RIGHT OUTER JOIN

Discussion