참고할 사이트
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이 가장 많이 사용된다고 한다.
원하는 데이터만 표시하기 위한 방법들이다.
'DATABASE' 카테고리의 다른 글
생활코딩 - DATABASE 관계형 데이터 모델링 - 논리적 데이터 모델링 (0) | 2021.05.19 |
---|---|
생활코딩 - DATABASE 관계형 데이터 모델링 - 개념적 데이터 모델링 (0) | 2021.05.19 |
생활코딩 - DATABASE 관계형 데이터 모델링 - 데이터 모델링의 순서, 업무파악 (0) | 2021.04.22 |
생활코딩 - DATABASE2 MySQL (0) | 2021.04.12 |
생활코딩 - DATABASE1 (0) | 2021.04.12 |