여러 테이블의 정보를 결합하여 하나의 단일한 테이블로 만드는 기술이다.
- RDB에서 가장 중요한 기능이 바로 JOIN이다.
예시를 들어보자.
1,3번 튜플에 중복된 정보가 있다. 한 눈에 보기 수월하다는 장점이 있지만 이는 데이터베이스의 용량을 많이 차지하고, 데이터 변경 시 문제를 발생시킨다.
⇨ 읽기가 편하지만 쓰기(데이터 변경)가 불편하다.
topic , author, profile 3개의 테이블로 나누어 데이터 중복을 줄일 수 있다. 데이터 변경에 수월하지만 한 눈에 보기 어렵다.
⇨ 쓰기(데이터 변경)가 편하지만 읽기가 불편하다.
📌이 둘 사이의 Trade-Off를 해결하기 위해 존재하는 것이 RDB의 JOIN 연산이다.
예시
SELECT * FROM TableA A LEFT JOIN TableB B ON A.key = B.key WHERE B.key IS NULL
SELECT * FROM TableA A LEFT JOIN TableB B ON A.key = B.key
SELECT * FROM topic
LEFT JOIN author
ON topic.author_id = author.aid
- topic 테이블의 튜플을 모두 가져온다.
- topic 테이블 왼쪽에 author 테이블의 튜플을 붙힌다.
(단, topic.author_id = author.aid 인 경우에 한하여)- topic 테이블에서 author 테이블의 튜플을 참조하지 않는 튜플이 있다면 null 로 값을 채운다.
SELECT * FROM topic
LEFT JOIN author
ON topic.author_id = author.aid
LEFT JOIN profile
ON author.profile_id = profile.pid;
SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid
의 결과 테이블과 profile 테이블을 LEFT OUTER JOIN 한다.
SELECT tid, topic.title, author_id, name, profile.title
AS job_title FROM topic
LEFT JOIN author
ON topic.author_id = author.aid
LEFT JOIN profile
ON author.profile_id = profile.pid;
SELECT tid, topic.title, author_id, name, profile.title
AS job_title FROM topic
LEFT JOIN author
ON topic.author_id = author.aid
LEFT JOIN profile
ON author.profile_id = profile.pid WHERE aid = 1;
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key
SELECT * FROM TableA A RIGHT JOIN TableB B ON A.key = B.key WHERE A.key IS NULL
대부분 LEFT OUTER JOIN으로 환원해서 사용한다. (잘 안쓰임)
SELECT * FROM TableA A INNER JOIN TableB B ON A.key = B.key
- NULL 값의 튜플이 존재하지 않는다.
- 일반적으로 성능이 좋다.
- inner join으로 원하는 데이터를 가져오기 어렵다면 left outer join을 사용해라.
SELECT * FROM topic
INNER JOIN author
ON topic.author_id = author.aid
left outer join 결과에서 한 쪽에 null값을 가지는 튜플을 제거한다.
SELECT * FROM topic
INNER JOIN author
ON topic.author_id = author.id
INNER JOIN profile
ON profile.pid = author.profile_id
이제부터 나오는 join들은 어렵지만 중요하지 않다.
SELECT * FROM TableA A FULL OUTER JOIN TableB B ON A.key = B.key
- 많은 RDB에서 지원하지 않는다.
- left outer join 결과와 right outer join 결과를 합쳐 중복을 제거하면
full outer join의 결과와 동일해진다.- 중요하진 않지만 그냥 이런게 있다는 것만 알아 두자.
-- full outer join
SELECT * FROM topic
FULL OUTER JOIN author
ON topic.author_id = author.aid
-- left outer join + right outer join 에서 중복 제거
(SELECT * FROM topic
LEFT JOIN author
ON topic.author_id = author.aid)
UNION -- DISTINCT가 생략되어있다.
(SELECT * FROM topic
RIGHT JOIN author
ON topic.author_id = author.aid)
SELECT * FROM TableA A FULL OUTER JOIN TableB B ON A.key = B.key WHERE A.key IS NULL OR B.key IS NULL
SELECT * FROM topic
LEFT JOIN author
ON topic.author_id = author.aid
WHERE author.aid is NULL
SELECT A.NAME, B.AGE FROM EX_TABLE A CROSS JOIN JOIN_TABLE B
- 모든 경우의 수를 전부 표현해주는 방식이다.
SELECT A.NAME, B.AGE FROM EX_TABLE A, EX_TABLE B
- 자기 자신과 조인하는 것이다.
- 하나의 테이블을 여러번 복사해서 조인한다고 생각하면 된다.
- 보통 자신의 칼럼을 변형시켜 활용할 때 사용한다.