개발자의 길/Database

[MYSQL] OUTER JOIN 과 INNER JOIN

토아드 2023. 12. 3. 23:38
반응형

MYSQL 에서 꽤나 자주 쓰이는 join 에 대해 설명하고자 한다. join 은 두 테이블의 column 을 비교하여 일치하는 row 들을 조합하는 것이다.

Inner Join

Inner Join은 두 테이블 간의 교집합을 찾는 SQL 조인 방식이다. 이 방식은 두 테이블에서 일치하는 데이터만 반환한다. 예를 들어, '고객' 테이블과 '주문' 테이블을 Inner Join 하면, 주문 기록이 있는 고객 정보만을 가져온다.

 

사용 예

SELECT *
FROM 고객
INNER JOIN 주문
ON 고객.고객ID = 주문.고객ID;

이 쿼리는 '고객'과 '주문' 테이블에서 고객 ID가 일치하는 레코드만을 선택한다.

Outer Join

Outer Join은 두 테이블의 합집합을 반환한다. 이 방식은 일치하는 데이터뿐만 아니라, 한 테이블에는 있지만 다른 테이블에는 없는 데이터도 포함한다. Outer Join에는 세 가지 유형이 있다: Left, Right, Full.

Left Outer Join

Left Outer Join은 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환한다.

SELECT *
FROM 고객
LEFT OUTER JOIN 주문
ON 고객.고객ID = 주문.고객ID;

위 쿼리는 '고객'의 모든 레코드와 '주문' 테이블의 일치하는 레코드를 가져온다.

Right Outer Join

Right Outer Join은 오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 반환한다.

SELECT *
FROM 고객
RIGHT OUTER JOIN 주문
ON 고객.고객ID = 주문.고객ID;

이 쿼리는 '주문'의 모든 레코드와 '고객' 테이블의 일치하는 레코드를 가져온다.

Full Outer Join

Full Outer Join은 두 테이블의 모든 레코드를 반환한다. 일치하는 레코드뿐만 아니라, 한쪽 테이블에만 존재하는 레코드도 포함된다.

SELECT *
FROM 고객
FULL OUTER JOIN 주문
ON 고객.고객ID = 주문.고객ID;

위 쿼리는 '고객'과 '주문' 테이블의 모든 레코드를 반환한다.

 

이때 주의해야 할 건 outer join 의 경우 조인을 하는 대상 table 의 개수가 여러개면 여러개의 row 를 반환하는 것이다. 예를 들어 left join 을 할 때 right table 에 조건에 맞는 컬럼이 여러개 있다면 left 테이블의 row 가 여러개 출력되면서 각각 매칭하는 right row 와 함께 나온다는 것이다. 아래는 에시이다.

 

고객ID | 고객이름
-------|---------
1      | 김철수
2      | 이영희

'고객' 테이블

주문ID | 고객ID | 주문내용
-------|--------|---------
101    | 1      | 상품A
102    | 1      | 상품B
103    | 2      | 상품C

'주문' 테이블

 

SELECT *
FROM 고객
LEFT OUTER JOIN 주문
ON 고객.고객ID = 주문.고객ID;

 

위 쿼리 실행 결과

고객ID | 고객이름 | 주문ID | 고객ID | 주문내용
-------|----------|--------|--------|---------
1      | 김철수   | 101    | 1      | 상품A
1      | 김철수   | 102    | 1      | 상품B
2      | 이영희   | 103    | 2      | 상품C
반응형