【初心者向け/ITスクール32日】SQLの基礎JOINについて
始めに
今日は、ITスクール 32日から学んだことを記事にシェアしたいと思います。
本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。
31日目は、JOINについて勉強しました。
JOINは二つ以上のテーブルの合わせ、意味のあるデーターを読む技術だと考えばいいです。
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