[SQL] ANSI JOIN文法
私はスクールを通じてデータベースを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