🙆‍♀️

【初心者向け/ITスクール32日】SQLの基礎JOINについて

2023/08/24に公開

始めに

今日は、ITスクール 32日から学んだことを記事にシェアしたいと思います。
本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。

31日目は、JOINについて勉強しました。
JOINは二つ以上のテーブルの合わせ、意味のあるデーターを読む技術だと考えばいいです。

https://zenn.dev/eldorado215/articles/f9c42fed60102d

31日に学んだJOINは実はJOINの用法の一つにすぎませんでした。
今日は本格的にJOINについて紹介します。

その前、この言葉を覚えてください。
>テーブルはレコードの集合だ。
>つまり、テーブルはエンティティの集合(集まり)だ。

SELF JOINにとってとても重要な概念です。


CROSS JOIN

CREATE TABLE TB1(NAME VARCHAR2(20), AGE NUMBER(3));
CREATE TABLE TB2(NAME VARCHAR2(20), AGE NUMBER(3));
  
INSERT INTO TB1 VALUES('김비버',30);
INSERT INTO TB1 VALUES('박비버',35);
INSERT INTO TB1 VALUES('최비버',40);
INSERT INTO TB1 VALUES('오비버',40);

INSERT INTO TB2 VALUES('김비버',30);
INSERT INTO TB2 VALUES('이비버',50);
INSERT INTO TB2 VALUES('정비버',55);

SELECT * FROM TB1, TB2;

以前の記事ではこのように、「,」を使ってテーブルを合わせみたしたが、
6個のレコードだったはずのテーブルが12個にもなっています。


https://hongong.hanbit.co.kr/sql-기본-문법-joininner-outer-cross-self-join/

SELECT * FROM TB1, TB2;
SELECT * FROM TB1 CROSS JOIN TB2;

このようなJOINをCROSS JOINといいます。二つのテーブル間の全てのケースを計算したJOINです。 TB1のレコード4つがそれそれ全てのBのレコードと交差(CROSS)するように、全てのケースを産出します。Dummyデーターが混ざりますので、実務ではほとんど使わないようです。


INNER JOIN

それでは、このようにぐちゃぐちゃになったデーターをまとめる方法は何でしょうか?
昨日はWHERE句でカラム(属性)の値を基準にして範囲を設定しました。

SELECT * FROM TB1 A, TB2 B WHERE a.name = b.name; 

実は、これがINNER JOINでした。INNER JOINは、二つのテーブルの中で、条件に一致する値をテーブルに作ります。その媒体がPrimary key(主キー)とForeign Key(外部キー)です。
殆どのJOINはINNER JOINを活用します。

SELECT * FROM TB1 INNER JOIN TB2 ON tb1.name = tb2.name;
SELECT * FROM TB1 A, TB2 B WHERE a.name = b.name; --EQUI JOIN 
SELECT * FROM TB1 JOIN TB2 USING (NAME); --JOIN~USING(カラム名)
SELECT * FROM TB1 NATURAL JOIN TB2; -- NATURAL JOIN, 条件なしで同じ値でつなぐ

,の変わりにINNER JOINをWHEREの代わりにONを使用したり、JOINとUSINGで繋ぐ方法もあります。


https://hongong.hanbit.co.kr/sql-기본-문법-joininner-outer-cross-self-join/


OUTER JOIN


https://hongong.hanbit.co.kr/sql-기본-문법-joininner-outer-cross-self-join/

LEFT/RIGHT OUTER JOIN:

基準になるテーブルと対象になるテーブルを合わせます。
イメージを見れば、基準ターブルは本来の姿で、対象テーブルはINNER JOINの値のみ表示され、他はnullに処理されます。

SELECT * FROM TB1 LEFT OUTER JOIN TB2 ON tb1.name = tb2.name;
SELECT * FROM TB1, TB2 WHERE tb1.name = tb2.name(+);

SELECT * FROM TB1 RIGHT OUTER JOIN TB2 ON tb1.name=tb2.name;
SELECT * FROM TB1, TB2 WHERE tb1.name(+) = tb2.name;

FULL OUTER JOIN :

SELECT * FROM TB1 FULL OUTER JOIN TB2 ON tb1.name=tb2.name;

難しい説明が多いですが、簡単に言いますと合集合です。我々が考えるJOINのイメージに一番近いもので、INNER JOINは二つのレコードが一致した場合のみなり立てますが、OUTER JOINは制限が一番ゆるく、データーさえあれば、合わされます。
INNER JOINの値と、LEFT JOIN- INNER JOIN , RIGHT JOIN-INNER JOIN この三つのテーブルを合わせた感じでしょう。

SELF JOIN

今日、DBの授業にあたって一番難しかったJOINです。
SELF JOINは一つのテーブルを二つに複製し、JOINします。
普通はその後、WHEREで処理してINNER JOIN処理をします。

<練習問題>
ウェブサイトにはメンバーが5人おり、管理者が2人います。
メンバーの名前はそれぞれメンバー1〜5で、管理者の名前は管理者1、2です。
メンバーのIDはそれぞれMEMBER1〜5で、管理者のIDはMANAGER1、2です。
メンバー1〜3は管理者1によって管理され、他のメンバーは管理者2によって管理されています。

CREATE TABLE web(
   me_id varchar2(8 char) primary key,
   me_name varchar2(15 char) not null,
   ma_id char(8 char)  
);

INSERT INTO web values('member1','회원1','manager1');
INSERT INTO web values('member2','회원2','manager1');
INSERT INTO web values('member3','회원3','manager1');
INSERT INTO web values('member4','회원4','manager2');
INSERT INTO web values('member5','회원5','manager2');
INSERT INTO web values('manager1','관리자1',null);
INSERT INTO web values('manager2','관리자2',null);

me_idはサイトの人々のIDで、こちらには会員も管理者も含まれています!
ma_idは会員を管理するmanagerのIDのことです。

このテーブル内で管理者が勉強しているメンバーが分かりたい場合はまず、nullが目障りですね。Managerというテーブルがあれば、二つのテーブルをINNER JOINで処理すれば楽ですが、
一つのテーブルしかないため、この場合はSELF JOINが必要になります。

そして、我々イメージでは、管理者が管理する会員は5人なのでレコードは5つになる必要があります。レコード数を減らすためには、INNER JOINが必要になります。
 
まずは、一つのテーブルを二つに臨機複製(JOIN)し別称をつけましょう。
この場合は、自分をJOINする形なのでINNER JOINでもFULL OUTER JOINでも関係はありません。

select * 
from web A inner join web B 
on a.me_id=b.me_id;

そして、テーブルをみれば、'manager1','manager2'はこのテーブルのPrimary keyでもありながら、同時にこのテーブルを繋げるForeign Keyということが分かりました!

select 
from web A inner join web B
on A.me_id = B.ma.id

select A.me_id,B.me_id,B.me_name
from web A inner join web B
on A.me_id = B.ma.id
manager1	회원1	member1
manager1	회원2	member2
manager1	회원3	member3
manager2	회원4	member4
manager2	회원5	member5

無事に結果を出すことができました。

Discussion