본문 바로가기
DB

[MySQL] Join, 조인( Inner Join, Outer Join )

by person456 2024. 4. 13.

Join 이란?

       ● 둘 이상의 테이블에서 데이터가 필요한 경우 두 테이블을 연결하는 것

       ● Inner Join, Outer Join, Natural Join, Cross Join 등이 존재함

       ● 조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는 것이 성능차이를 일으키기 때문에 중요함

       ● Inner Join은 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 옵티마이저가 조인의 순서를 조절해 최적화를 진행

       ● Outer Join은 옵티마이저가 조인 순서 선택이 불가능함

 

* Inner Join

       ● 가장 일반적인 Join으로, 교집합을 의미함.

       ● 동등 조인 ( Equal Join )이라고도 하며 N개의 테이블을 조회하려면 N-1번의 Join이 필요함

       ● Join 후 Select를 할 때, 두 테이블에 공통된 이름으로 존재하는 컬럼에 Alias 설정을 안하면 에러 발생

         --> A테이블에도 id, B테이블에도 id가 있을 때 a.id 혹은 b.id라고 명시해둬야함

         --> 혹은 Using절을 사용하여 Using(공통 컬럼)의 형식으로 on절을 대신하여 사용도 가능함 

         --> Using을 사용하면 (공통컬럼) 의 컬럼 명에 Alias 사용 불가 

       ● Natural Join은 두 테이블이 가지고 있는 공통 컬럼을 토대로 Join을 한다는 의미

         --> 하지만 두 테이블의 공통 속성이 여러개라면 on 절의 조건을 and로 묶어 연산하는 것이기 때문에

              사용시 더욱 주의해야함.

 

Inner Join
Inner Join 문법

 

* Outer Join

       ● Left Outer Join, Right Outer Join, Full Outer Join이 존재함.

       ● 어느 한쪽 테이블에는 데이터가 존재하는데, 다른 쪽 테이블에 데이터가 존재하지 않을 경우를 해결하기 위한 방법

        

        * Left Outer Join

               ● 왼쪽 테이블을 기준으로 Join 조건에 일치하지 않는 데이터까지 출력

Select COL1, COL2, ... ,COLN
From table1 Left Outer Join table2
on or Using

        * Right Outer Join

               ● 오른쪽 테이블을 기준으로 Join 조건에 일치하지 않는 데이터까지 출력

Select COL1, COL2, ... , COLN
From Table1 RIGHT OUTER JOIN Table2
on or Using

        * Full Outer Join

               ● 양쪽 테이블을 기준으로 Join 조건에 일치하지 않는 데이터까지 출력

               ● MySQL은 지원하지 않는 방식 --> Union 사용으로 해결 가능

Select *
from Table1 LEFT OUTER JOIN Table2
on or Using
UNION
Select *
from Table1 RIGHT OUTER JOIN Table2
on or Using

 

 

* Self Join (셀프 조인)

  • 하나의 테이블에 존재하는 컬럼을 활용하여 Join하는 방법
Select a.col1, a.col2, b.col1, b.col2
from Table1 a join Table1 b
on a.col1 = b.col2

 

* None-Equal Join

  • table의 PK, FK가 아닌 일반 Column을 Join으로 지정하는 방식
  • None-Equal이기 때문에 표현식을 사용하여 값 비교 등을 진행
Select a.COL1, a.COL2, b.COL1, b.COL2
from Table1 a join Table1 b
on a.COL1 >= b.COL2
and b.COL1 >= a.COL2;