DATABASE

[MariaDB/Mysql] Join 정리 (INNER/LEFTJOIN)

예나부기 2021. 8. 11.

JOIN

 

JOIN이란?

  • 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것
  • 둘 이상의 테이블을 연결할 때 대상 테이블들이 적어도 하나의 컬럼을 공유해야 한다. (PK/FK)

왜 해야할까?

JOIN의 필요성을 설명하기 전에,

정규화의 개념에 대하여 이해하는 것이 먼저다.

예를 들어 TOPIC 테이블과 COMMENT 테이블이 있다고 가정할 때,

중복된 부분으로 인해 무결성이 깨지고, 저장 용량이 낭비된다.

이러한 테이블을 분해(쪼개기)하는 것이 정규화 이다. 정규화를 통해 중복된 데이터를 제거해보자.

 

테이블을 쪼갤 때는 각 테이블이 각 주제에 맞에 쪼개지도록 한다.

 

"Every table in the database needs to have a single theme. - 모든 테이블은 하나의 주제만 가져야 한다."

 

테이블 쪼개기

3개의 테이블로 쪼갰으며, 이렇게 분해 했을 시

추후 수정사항이 생겼을 때 해당 테이블에서만 데이터를 수정하면 다른 모든 데이터에 반영되어 편리하다.

하지만, 읽고자 하는 데이터가 여러 테이블로 분산되어 있어 읽기에는 불편하다는 단점이 있다.

 

이러한 점을 보완하기 위해 나온 기능이 JOIN기능이다.

INNER / LEFT / RIGHT / OUTER / EXCLUSIVE JOIN 등이 있지만,

INNER와 LEFT JOIN만 다루려고 한다. (RIGHT는 LEFT JOIN에서 대상 테이블을 반대로만 하면 되기 때문)

 

 

생활코딩에서 제공해 준 예시 테이블을 가지고 JOIN을 연습해보자.

 

예시테이블

 

INNER JOIN - 교집합

A테이블과 B테이블 중 겹치는 부분(공통되는 부분)만 보여준다.

= 왼쪽과 오른쪽 표 모두에서 존재하는 행만 모아서 하나의 행을 만들어 준다.

 

TOPIC과 AUTHOR 테이블을 이너조인해보자. 

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

 

 

1. TOPIC 테이블의 author_id, AUTHOR 테이블의 aid를 기준으로

AUTHOR 테이블에서 TOPIC 테이블과 동일한 행을 가져온다.

2.이 과정에서 AUTHOR 테이블에는 있지만 TOPIC 테이블에는 없는 aid=3, name='blackdew'인 행이 사라진다.

3.동일한 기준으로 보았을 때, author_id가 null인 tid=4, title='Oracle'인 행이 사라진다.

결과테이블 >>

여기에 PROFILE 테이블도 추가해 본다면?

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

 

LEFT OUTER JOIN

기준이 되는 표를 왼쪽에 두고, 이 표를 기준으로 오른쪽의 표를 합성해서 하나의 표를 만드는 방법

포인트는, 왼쪽의 테이블의 모든 행은 출력된다는 점이다. 오른쪽에 매칭되지 않는다면 NULL로 채워준다.

 

TOPIC과 AUTHOR 테이블을 LEFT 조인해보자. 

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

1. TOPIC 테이블의 모든 행을 가져온 뒤 TOPIC 테이블의 author_id, AUTHOR 테이블의 aid를 기준으로

AUTHOR 테이블에서 TOPIC 테이블과 동일한 행을 가져온다.

2. AUTHOR테이블과 일치되지 않는 TOPIC테이블의 tid=4, title='Oralce'인 행을 NULL로 채워준다.

 

 

 

참고 : https://opentutorials.org/module/4118

 

SQL Join

수업소개 관계형 데이터베이스에서 테이블과 테이블의 관계를 이용해서 새로운 테이블을 만들어내는 태크닉인 join을 알려드리는 수업입니다.  이 수업은 아래와 같은 내용을 다루고 있습니다.

opentutorials.org

 

댓글