[SQL] 테이블 합치기 - JOIN

2024. 8. 19. 23:28Language/SQL

  테이블은 목적에 따라 여러 속성을 가지고 있다. 하지만 현재 필요로 하는 속성이 다른 테이블에 있는 경우가 더러 있다. 이럴 때 두 테이블의 공통 속성을 기준으로 테이블의 데이터를 합친 결과 데이터를 조회할 수 있다.

 

0. JOIN 의 종류

JOIN 의 종류

 

 나의 경우 JOIN 에 대해 이해할 떄 위와 같은 그림을 통해 이해하였다. 그저 외우기보다 그림을 보면 각 상황에 결과 테이블이 어떻게 생성될지 생각을 반복했다. 종류가 굉장히 많아 보이지만 일단 'LEFT JOIN' 과 'RIGHT JOIN' 중에 하나만 이해하면 반대되는 개념도 쉽게 이해 가능했다(나의 경우에는 LEFT JOIN 을 기준으로 학습했다). 그림을 통해 자주 사용하는 2가지 JOIN 을 정리했다.

  • (INNER) JOIN : 'JOIN' 또는 INNER JOIN' 으로 불리는 JOIN 이다. 기준 컬럼에 대한 레코드가 두 테이블 모두 존재해야 두 테이블의 레코드를 모두 조회하며 만약, 둘 이상 레코드가 없다면 해당 컬럼값에 대한 레코드는 조회에 포함되지 않는다. 위 그림에서 처럼 두 테이블에 모두 속한 레코드만 조회하는 '교집합' 의 JOIN 이다.
  • LEFT JOIN : 기준 컬럼값을 갖는 두 테이블의 레코드와 기준 컬럼값을 갖는 'A 테이블(왼쪽, 첫 번째 지정 테이블)' 의 레코드를 조회에 포함하는 JOIN 이다. 'B 테이블(오른쪽, 두 번째 지정 테이블)' 에 기준 컬럼값에 대한 레코드가 없어도 'A 테이블' 쪽 레코드는 조회되는 것이다. 위 그림처럼 결국 'A 테이블 레코드 + 기준 컬럼값을 갖는 B 테이블 레코드' 를 조회하게 되는 것이다.

 

1. 기본 문법

SELECT 조회컬럼명
FROM 테이블명1 별명1 JOIN 테이블명2 별명2 ON 별명1.기준컬럼명 = 별명2.기준컬럼명

 

 데이터를 합치고 싶은 테이블 'A, B' 가 있을 때, 두 테이블명을 각각 적고 약어로 사용할 별명을 지정한다. 두 테이블 명 사이에는 사용할 JOIN 을 적어주며, INNER JOIN 의 경우 'INNER' 를 생략 가능하다. 이 후 ON 을 적고 기준 칼럼이 될 칼럼명을 각각의 테이블에서 지정하고 두 컬럼값이 같아야 함을 설정한다. 이렇게 하면 기준 컬럼값이 같은 각 테이블의 레코드가 합쳐진 결과를 조회할 수 있다.

 

 

2. 사용 예시

 'food_orders' 테이블과 'payments' 테이블을 통해 한국 음식의 주문별 결제 수단과 수수료율(vat)을 조회하는 쿼리 작성

SELECT a.order_id, a.restaurant_name, a.price, b.pay_type, b.vat
FROM food_orders a LEFT JOIN payments b ON a.order_id = b.order_id
WHERE cuisine_type = 'Korean'

LEFT JOIN 활용 예시

 

조회 결과의 조건은 '주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율' 컬럼과 결제 정보가 없는 주문 정보도 조회하는 것이다. 두 테이블 갖는 'order_id(키 컬럼)' 를 기준으로 LEFT JOIN 을 사용했다. 왼쪽 대상 컬럼이 'food_orders' 인데 여기에 결제 정보를 제외한 나머지 컬럼이 있어 해당 정보를 남기기 위해 LEFT JOIN 을 사용한 것이다(만약 오른쪽 대상 컬럼이었다면 RIGHT JOIN 을 사용했을 것이다).