DATABASE

생활코딩 DATABASE - Join

joy_lee 2021. 4. 21. 22:22

참고할 사이트

https://sql-joins.leopard.in.ua/

join의 형태를 그림으로 나타낸 사이트

 

 

Join을 하기 전에...

table은 한 가지 주제만 가지고 있어야 한다 -> 중복이 없는 것을 목표로

table을 처음부터 잘 설계해둬야 나중에 고생하지 않는다.

 

위의 topic table은 중복되는 자료가 있다.

아래처럼 세 테이블로 나눠서 저장하면 수정이 편해지고, 용량도 덜 차지할 수 있다.

하지만 보기가 불편해진다.

이 세 테이블을 위의 큰 테이블처럼 한번에 보기 위해서는 JOIN이라는 기능을 사용하면 된다.

JOIN은 어떤 조인인지(LEFT JOIN, RIGHT JOIN...) 명시해주고, ON뒤에는 두 자료를 연결할 때 기준이 되는 key들을 적어주면 된다.

 

LEFT JOIN

1
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid
cs

a LEFT JOIN b 는 공통으로 가지고 있는 데이터와, 왼쪽 a table에만 있는 자료들을 나타낸다.

b 에는 없는 자료일 경우, NULL로 처리한다. 

author의 aid=3인 자료는 topic 에서 사용되지 않았으므로 join 한 결과에는 나타나지 않는다.

 

1
2
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid;                                
 
cs

( topic LEFT JOIN author ) LEFT JOIN profile 인 형태이다.

tid=4인 경우는 author가 NULL이므로 profile까지 NULL 로 row가 채워져있다.

 

 

INNER JOIN

1
SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid
cs

inner join 의 경우는 두 table이 공통적으로 가지고 있는 데이터만 나온다.

한 쪽에만 있는 topic 의 tid=4나, author의 aid=3인 자료들은 표시되지 않는다.

1
SELECT * FROM topic INNER JOIN author ON topic.author_id = author.id INNER JOIN profile ON profile.pid = author.profile_id
cs

 

FULL OUTER JOIN

( a LEFT JOIN b) UNION ( a RIGHT JOIN b)

로 FULL OUTER JOIN 을 할 수 있다.

중간의 UNION의 경우, UNION (DISTINCT) 인 명령어로, 뒤에 다른 명령어를 쓰지 않으면 중복된 값을 제거한다.

1
(SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid) UNION (SELECT * FROM topic RIGHT JOIN author ON topic.author_id = author.aid)
cs

tid=4인 데이터와, aid=3인 데이터도 모두 표시됨을 확인할 수 있다.

 

EXCLUSIVE LEFT JOIN

a 에만 있는 데이터를 선별하기 위해 따로 명령어가 있는 것이 아니다.

a LEFT JOIN b WHERE b.id is NULL

로 표현한 것이다.

a와 b의 LEFT JOIN에서(b에만 있는 데이터 제외됨)

b.id = NULL인 값(a에만 있는 데이터)만 표시하도록 한 것이다.

1
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid WHERE author.aid is NULL
cs

 

 

JOIN은 LEFT JOIN과 INNER JOIN이 가장 많이 사용된다고 한다.

원하는 데이터만 표시하기 위한 방법들이다.