DBMS/MySQL 정리

[MySQL] 조인

웹코린이 2023. 6. 23. 12:29
728x90

내부 조인 (INNER JOIN)

  • 보통 조인이라고 하면 내부 조인인 경우가 대부분일정도로 많이 쓰이는 형태이다.
  • 내부 조인은 조인키에 해당하는 각 테이블의 열 값을 비교해 조건에 맞는 값을 검색한다.

INNER JOIN 벤 다이어그램

 

INNER JOIN은 위의 그림과 같이 서로의 데이터의 교집합(서로 겹치는 부분)을 이용해 JOIN하는 방법이다.

 

INNER JOIN 선언 방법

SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE [검색 조건]

 

예제]

고객 번호 고객 이름
0001 박현규
0002 김은숙
0003 한승우
주문 번호 고객 번호 주문 날짜
100 0001 2021-11-16
101 0002 2021-11-17
102 0004 2021-11-18

위의 표는 고객 테이블과 주문 테이블이다. 고객의 주문 내역을 모두 확인하기 위해 내부 조인을 해야한다. 또한, 고객 번호를 조인 조건으로 가져야 한다.

 

조인하는 SQL문

SELECT [고객.고객 번호], [고객], [고객 이름], [주문.주문 번호], [주문.고객 번호], [주문.주문 날짜]
FROM [고객]
INNER JOIN [주문] ON [고객.고객 번호] = [주문.고객 번호]

 

결과

고객 번호 고객 이름 주문 번호 고객 번호 주문 날짜
0001 박현규 100 0001 2021-11-16
0002 김은숙 101 0002 2021-11-17
0003 한승우 102 0004 2021-11-18

 

ON 문과 WHERE 문의 차이

  • ON 문은 조인할 때 조인 조건을 위해 사용한다.
  • WHERE 문은 조인을 완료한 상태에서 조건에 맞는 값을 가져올 때 사용한다.

서로의 기능이 비슷하여 혼동할 수 있지만 데이터 매칭 과정에서 오차가 발생할 수도 있으므로 상황에 맞게 사용해야 한다.

 

 

3개 이상 테이블의 INNER JOIN 선언 방법

SELELCT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
INNER JOIN [테이블 3] ON [테이블 2.열] = [테이블 3.열]
WHERE [검색 조건]

 

 

외부 조인(OUTER JOIN)

  • 다른 테이블에 있는 행에서 일치 항목이 아닌 행을 조합해 검색해야 할 때 사용한다.

 

OUTER JOIN 선언 방법

SELECT [열 이름]
FROM [테이블 1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE [검색 조건]

<>로 감싸진 부분은 3개의 항목 중 1개만 선택하여야 한다는 뜻이다.

 

LEFT OUTER JOIN

 

 

LEFT OUTER JOIN 벤 다이어그램

 

예를 들어, A, B 테이블이 좌우에 있다고 생각했을 때 A 테이블을 기준으로 B 테이블을 조인하고 싶다면 LEFT를 사용하고, B 테이블을 기준으로 A 테이블을 조인하고 싶다면 RIGHT를 사용한다.

 

고객 번호 고객 이름 
1 부엉이
2 독수리
3 비둘기
주문 번호 고객 번호 주문 날짜 
100 1 2021-11-16 10:57:23.700
200 4 2021-11-16 10:57:23.700
300 3 2021-11-16 10:57:23.700

위의 표를 LEFT OUTER JOIN을 하면 고객 테이블이 우선 결과에 포함된다. 따라서 고객 번호가 2번인 독수리는 주문 테이블에 없으므로 NULL로 표시 된다. 결과는 아래의 표와 같다.

 

고객 번호 고객 이름 주문 번호 고객 번호 주문 날짜
1 부엉이 100 1 2021-11-16 10:57:23.700
2 독수리 NULL NULL NULL
3 비둘기 300 3 2021-11-16 10:57:23.700

 

위의 표 쿼리문

SELECT [고객.고객 번호], [고객.고객 이름], [주문.주문 번호], [주문.고객 번호], [주문.주문 날짜] FROM [고객]
LEFT OUTER JOIN [주문] ON [고객.고객 번호] = [주문.고객 번호]

 

 

 

LEFT OUTER JOIN에서 기준 테이블의 데이터만 추출한 벤 다이어그램

기준 테이블에 있는 데이터만 추출하려면 LEFT OUTER JOIN 결과에서 NULL 데이터만 추출하면 된다.

 

 

RIGHT OUTER JOIN

위의 예시에서 주문 테이블을 기준 테이블로 잡고 조인을 하게되면 아래의 표와 같다.

고객 번호 고객 이름
1 부엉이
2 독수리
3 비둘기
주문 번호 고객 번호 주문 날짜
100 1 2021-11-16 10:57:23.700
200 4 2021-11-16 10:57:23.700
300 3 2021-11-16 10:57:23.700

 

RIGHT OUTER JOIN 후

고객 번호 고객 이름 주문 번호 고객 번호 주문 날짜 
1 부엉이 100 1 2021-11-16 10:57:23.700
NULL NULL 200 4 2021-11-16 10:57:23.700
3 비둘기 300 3 2021-11-16 10:57:23.700

RIGHT OUTER JOIN을 했을 경우 오른쪽 테이블 (주문 테이블)을 기준으로 JOIN을 하였기 때문에 주문 테이블의 결과는 모두 표시되었고, 고객 테이블에 적혀있지 않은 정보는 NULL로 표시되는 것을 알 수 있다.

 

RIGHT OUTER JOIN 벤다이어그램

 

 

 

위와 마찬가지로 기준 테이블에 있는 데이터만 추출하려면 RIGHT OUTER JOIN 결과에서 NULL 데이터만 추출하게 되면 B의 데이터만 추출할 수 있다.

 

RIGHT OUTER JOIN 에서 기준 테이블의 데이터만 추출한 벤 다이어그램

 

FULL OUTER JOIN 

  • LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 것을 말한다.
  • 양쪽 테이블의 일치하지 않는 행도 모두 검색한다.
  • 예시] 잘못된 고객 번호로 주문 내역이 기록된 것이 없는지 확인하고 싶을 때 사용한다.

 

FULL OUTER JOIN 벤 다이어그램

 

위의 벤다이어그램을 표로 예시를 들어보면 아래와 같다.

고객 번호 고객 이름 
1 부엉이
2 독수리
3 비둘기
주문 번호 고객 번호 주문 날짜
100 1 2021-11-16 10:57:23.700
200 4 2021-11-16 10:57:23.700
300 3 2021-11-16 10:57:23.700

 

FULL OUTER JOIN 후

고객 번호 고객 이름 주문 번호  고객 번호 주문 날짜
1 부엉이 100 1 2021-11-16 10:57:23.700
2 독수리 NULL NULL NULL
3 비둘기 300 3 2021-11-16 10:57:23.700
NULL NULL 200 4 2021-11-16 10:57:23.700

 

 

교차 조인

  • 각 테이블의 모든 경우의 수를 조합한 데이터가 필요할경우 교차 조인을 사용한다.
  • 카르테시안 곱이라고도 한다.

 

교차 조인의 기본 형식

SELECT [열 이름]
FROM [테이블 1]
	CROSS JOIN [테이블 2]
WHERE [검색 조건]

 

728x90