[Oracle] JOIN

당당·2023년 4월 29일
0

Oracle

목록 보기
12/51

https://opentutorials.org/course/3885/26417

📔설명

관계형 DB 앞에 붙은 말은 Relation이다.
표라고 하는 형태로 데이터를 다룬다.

표를 사용하다보면 표가 커지게 된다. 이때, 관계형 DB를 사용하면
표를 필요에 따라 쪼개고 합칠 수 있다.


📌테이블 분해

만약 topic테이블에 각각의 게시글을 누가 썼는지, 그리고 그 사람에 대한 소개글을 추가한다고 해보자.

이렇게 되면, hyejin이라는 사람에 대한 소개를 바꾸고 싶다고 하면, 만약 1억개라면 1억번을 바꿔야한다. 이것을 바꾸는데 3년이 걸린다고 한다...

그리고 만약 게시글을 쓰지 않은 사람에 대한 소개는 나타낼 수 없다.

그러므로 표를 쪼개보자.
토픽에 대한 내용과 저자에 대한 내용으로 나눠보자.

그리고, 저자에도 id값을 줘서 식별자로 주자.
그리고 토픽 테이블에 author 테이블의 id를 적으면 된다.

만약 dang의 프로필을 변경하고싶다면 하나만 변경하면 다 바뀌는 폭발적인 효과를 가져올 수 있다.

그리고 저자이지만 한번도 글을 작성하지 않은 사람도 author테이블에 있을 수 있다.


🔧테이블 조립

표를 분해하면 쓰기는 좋아지만 읽기가 불편해진다.
그러므로 JOIN을 이용해서 필요에 따라 조립해서 마치 원래 조립된 상태인 것 처럼 보여줄 수 있다.

SELECT *
FROM topic LEFT JOIN author ON topic.author_id=author.id;

그러면 우리눈에 보이는 결과는 위처럼 된다.
이것이 JOIN의 환상적인 기능이다!


🧪실습

테이블 분해

이제 SQL Developer를 통해 테이블을 분해해보자!

먼저, author라는 테이블을 추가해야한다.

접속한 DB의 테이블에 우클릭을 해서 테이블을 생성하자.


PK도 설정해주자! 그 다음 DDL이라는 것을 클릭해보면 위 처럼 나온다.
그다음 실행을 눌러주면

테이블에 author가 추가됐다.

그리고 topic 테이블에 author id 값을 추가해줘야 한다.

topic테이블에서 열을 클릭하고 해당 버튼을 누르면 테이블을 편집할 수 있다.

적어주고 확인을 누르면 AUTHOR_ID 컬럼이 추가된 것을 확인할 수 있다.

Author테이블의 id값도 1씩 증가하게 만들어줄 시퀀스를 만들어보자.

우클릭 해서 새 시퀀스를 누르자.

이렇게 적고 확인을 누르면 새 시퀀스가 생성된다.

이제 sql로 author에 값을 넣어보자

insert into author(id, name, profile)
values ( seq_author.nextval, 'hyejin', 'DBA');

저 버튼을 누르면 실행이 된다. 아니면 Ctrl+Enter를 치면 된다!

성공~
Author테이블을 보면 행이 추가된 것을 볼 수 있다.

이제 topic 테이블에 가서 author_id를 1로 바꾸자!
(사실 외래키를 사용하면 더 편할테지만 아직은 때가 아니다!)

커밋 버튼을 꼭 눌러줘야 반영된다.

insert into author(id, name, profile) 
values ( seq_author.nextval, 'dang', 'developer');

insert into author(id, name, profile) 
values ( seq_author.nextval, 'dangdang', 'data scientist');

둘다 추가해주자~
sql developer은 한행 한행씩 실행한다! (Ctrl+enter)

잘 추가됐다!

insert into topic 
values ( seq_topic.nextval, 'MongoDB', 'Mongo DB is ...',SYSDATE,3);

토픽 테이블에 데이터를 하나만 더 추가하자!
(author_id가 3인 사람이 작성한 게시글)

이제 다음에는 JOIN을 해보자!

테이블 조립

여기서, AUTHOR_ID와 같은 속성을 외래키(Foreign Key)라고 한다.

select * 
from topic left join author on topic.author_id=author.id;

아까 엑셀에서 예상했던 대로 똑같이 나왔다!! 신기!

select topic.id as topic_id, title, name
from topic left join author on topic.author_id=author.id;


출력되는 id가 누구의 id인지 모를 때, 위 처럼 별명(allias)를 주면 된다.
as는 생략 가능하다.

select T.id as topic_id, title, name
from topic T left join author on T.author_id=author.id;

select
    T.id as topic_id, title, name
from topic T
    left join author A
    on T.author_id=A.id;


테이블에도 별명을 지어줄 수 있다!

만약 토픽테이블 id가 1인 행만 갖고오고 싶다면,

select
    T.id as topic_id, title, name
from topic T
    left join author A
    on T.author_id=A.id
where 
    T.id=1;

where절을 이용해서 하면 가능하다!


🕦이후

실제로, 데이터베이스를 이렇게 직접적으로 데이터베이스만을 사용하는 경우는 없다. 사용자가 사용하는 UI와 데이터베이스 사이에 존재하는 중간 다리 역할이 middleware이다. jsp, spring, servlet, php, python, node.js, ruby와 같은 것이 미들웨어다.

오라클 여행이 끝났는데, 이 다음은 관계형 데이터 모델링 방법에 대해 배우고,
그 다음은 SQL Join을 배울 것이다! 그다음 Docker 다음은 MySQL, SQLite로..!! SQL Server도 배우고싶다!

profile
MySQL DBA 신입

0개의 댓글