본문 바로가기

DATABASE

SQL JOIN - LEFT OUTER JOIN, INNER JOIN

 

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

 

SQL JOIN이란?

관계형 데이터베이스에서 여러 개의 테이블을 묶어 하나의 테이블로 만드는 기술이다.

"여러 개의 표로 분산된 정보를 결합해서 하나의 단일한 표로 만드는 기술 = JOIN"

정보를 저장하고 처리하는 관계형 데이터베이스의 가장 중요한 기능이 join이다.

어떤 종류의 join이 있는지, 어떻게 동작하는지를 잘 알아야 준수한 관계형 데이터베이스 사용자라고 할 수 있다.

 

<문제상황>

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&amp;amp;amp;list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

topic 테이블(표)에 이렇게 중복되는 행(노란색)이 발생한다.

중복되는 행은 데이터의 용량을 아주 많이 쓰고,

천만 개의 데이터가 있다면 중복되는 행이 변경될 때 천만개의 데이터를 수정해야 한다.

따라서 중복을 제거하는 것은 중요하다.

 

또한 추가로 comment 테이블을 만들고 comment에 id, description, name, city 컬럼을 만든다면

topic 데이터와 comment 데이터가 중복된다,

 

여기서 중복되는 부분을 author라는 테이블로 별도로 표를 쪼갠다면?

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&amp;amp;amp;list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

기존에 있던 topic 테이블은 author의 id 값을 받는다.

이렇게 되면 저자(author)에 대한 정보는 하나의 테이블 안에서만 존재하고,

다른 테이블에는 저자를 식별하는 저자 테이블의 primary key 값만을 기록한다, 즉 중복이 제거된다.

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&amp;amp;amp;list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

 

모든 표는 하나의 테마(주제)만을 가져야 한다.

 

보기 편하다 VS 수정하기에 좋다.

하나의 테이블에서 모든 정보를 표현하면 읽기 편하다는 장점을 가진다.

표를 분산하면 사용하기에 편리하나 읽기 불편하다는 단점이 생긴다.

(연결된 테이블에 일일이 찾아가서 값을 확인해야 한다)

이러한 문제를 해결하기 위해 등장한 것이 관계형 데이터베이스의 JOIN 이다.

 

테이블이 분산되어 있을 때 직접 해당 id값의 테이블로 찾아가 값을 확인해야 하는 불편 발생 -> 애초에 저장할 때 분산되어 있지 않고 합쳐져 있던 것처럼 사용하고 싶다 -> JOIN의 등장

왼쪽에 있는 표와 오른쪽에 있는 표 양쪽의 정보를 출력, 출처 https://sql-joins.leopard.in.ua/
INNER JOIN에서 왼쪽에만 있는 정보도 출력하는 것, 출처&amp;amp;nbsp;https://sql-joins.leopard.in.ua/

 

왼쪽에 있는 표와 오른쪽에 있는 표의 정보 모두 출력한다, 출처&amp;amp;nbsp;&amp;amp;nbsp;https://sql-joins.leopard.in.ua/

 

LEFT OUTER JOIN

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&amp;amp;amp;list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

topic의 id가 4인 행은 오른쪽에 존재하지 않는다.

그리고 오른쪽의 author의 id가 3인 행은 왼쪽에서 사용되지 않는다.

이런 경우 LEFT JOIN을 하느냐, INNER JOIN을 하느냐, OUTER JOIN을 하느냐에 따라 결과가 미묘하게 달라진다.

 

이때 LEFT JOIN을 사용하면

SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid
//topic 테이블을 기준으로, topic 테이블은 왼쪽에, author 테이블은 오른쪽에 놓는다
//topic table의 author_id는 author테이블의 aid와 값이 같다. 두 가지를 한가지로 연결하라

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&amp;amp;amp;list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

왼쪽에 있는 테이블에는 값이 있는데 그 값에 해당하는 오른쪽 테이블의 행이 없다면 NULL값으로 표현된다

(만약 RIGHT JOIN을 사용하면 그 반대)

해당 문장에서 다른 테이블을 연결하여 이어 붙일수도 있다.

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

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&amp;amp;amp;list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq

위에 연결된 테이블에 profile 테이블의 pid로 author테이블과 profile 테이블을 이어서 연결시켰다. 

참고로 중복되는 컬럼의 구분을 위해 점연산자를 사용하여 구분한다.

 

원하는 컬럼의 행만 확인하거나, 컬럼의 이름을 변경하여 확인하고 싶다면?

SELECT tid, topic.title, author_id, name, profile.title AS job_title 
//tid, topic의 title, author_id, name, profile의 title만 남긴다
//profile title의 이름은 job_title로 변경한다
//중복되는 컬럼(title)의 구분을 위해 점연산자를 사용한다

FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid;
//left join로 테이블을 연결한 것

 

RIGHT OUTER JOIN

기준이 왼쪽에서 오른쪽에 있는 표로 바뀌었을뿐 동작하는 것은 LEFT JOIN과 동일하다.

 

INNER JOIN

조인을 할 때 왼쪽 테이블과 오른쪽 테이블이 있는데

양쪽 모두에 존재하는 행 만을 가지고 새로운 테이블(표)를 만드는 것이 INNER JOIN 이다.

서로의 공통부분으로 표를 만들기 때문에, INNER JOIN을 하면 NULL행이 존재하지 않게 된다.

(LEFT JOIN은 오른쪽 테이블에 값이 없어도 왼쪽 테이블이 기준이기 때문에 가능한 것과 차이)

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

inner join이기 때문에 테이블은 null 값의 행은 삭제된 형태가 된다.

 

 

 

 

 

 

 

 

해당 게시글은 '생활코딩' 님의 SQL JOIN 강의를 참고하였습니다.

출처 https://www.youtube.com/watch?v=2Xa54XBXbk0&list=PLuHgQVnccGMAG1O1BRZCT3wkD_aPmPylq