[데이터베이스] SQL JOIN

hyyyynjn·2021년 9월 30일
0

면접대비

목록 보기
16/31
post-thumbnail

테이블 쪼개기

여러 테이블의 정보를 결합하여 하나의 단일한 테이블로 만드는 기술이다.

  • RDB에서 가장 중요한 기능이 바로 JOIN이다.

예시를 들어보자.


1,3번 튜플에 중복된 정보가 있다. 한 눈에 보기 수월하다는 장점이 있지만 이는 데이터베이스의 용량을 많이 차지하고, 데이터 변경 시 문제를 발생시킨다.
⇨ 읽기가 편하지만 쓰기(데이터 변경)가 불편하다.



topic , author, profile 3개의 테이블로 나누어 데이터 중복을 줄일 수 있다. 데이터 변경에 수월하지만 한 눈에 보기 어렵다.
⇨ 쓰기(데이터 변경)가 편하지만 읽기가 불편하다.

📌이 둘 사이의 Trade-Off를 해결하기 위해 존재하는 것이 RDB의 JOIN 연산이다.

JOIN 시각화


JOIN

예시


  • topic 테이블의 4번째 튜플은 author 테이블의 정보를 참조하지 않는다.
  • author 테이블의 3번째 튜플은 topic 테이블에서 참조되지 않는다.

LEFT (OUTER) 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

  1. topic 테이블의 튜플을 모두 가져온다.
  2. topic 테이블 왼쪽에 author 테이블의 튜플을 붙힌다.
    (단, topic.author_id = author.aid 인 경우에 한하여)
  3. 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;

RIGHT OUTER JOIN

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으로 환원해서 사용한다. (잘 안쓰임)

INNER 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들은 어렵지만 중요하지 않다.

FULL OUTER 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)

EXCLUSIVE LEFT JOIN

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

CROSS JOIN

SELECT
A.NAME, B.AGE
FROM EX_TABLE A
CROSS JOIN JOIN_TABLE B
  • 모든 경우의 수를 전부 표현해주는 방식이다.

SELF JOIN

SELECT
A.NAME, B.AGE
FROM EX_TABLE A, EX_TABLE B
  • 자기 자신과 조인하는 것이다.
  • 하나의 테이블을 여러번 복사해서 조인한다고 생각하면 된다.
  • 보통 자신의 칼럼을 변형시켜 활용할 때 사용한다.

0개의 댓글