이제 데이터 공부 안하는 블로그

조인(LEFT OUTER JOIN, RIGHT OUTER JOIN, INNER JOIN) 본문

SQL

조인(LEFT OUTER JOIN, RIGHT OUTER JOIN, INNER JOIN)

공사노비 2021. 11. 12. 11:25

LEFT OUTER JOIN

왼쪽 테이블을 기준으로 테이블이 합쳐진다.

아래 그림에는 item 테이블(왼쪽) 과 stock 테이블(오른쪽)이 있다. 이 두개의 테이블을 LEFT OUTER JOIN으로 합쳐보겠다.

 

 

SQL문은 이렇게 써주면 된다.

SELECT 
    item.id,
    item.name,
    stock.item_id,
    stock.inventory_count
FROM item LEFT OUTER JOIN stock 
ON item.id = stock.item_id 

 

FROM 테이블 1 LEFT OUTER JOIN 테이블2  -> 이렇게 조인을 원하는 테이블들의 이름을 써주면, 테이블1(왼쪽)을 기준으로 조인 된다

ON item.id = stock.item_id -> item 테이블의 id 컬럼과 stock테이블의 item_id 컬럼을 기준으로 조인하겠다는 말이다. 

 

 

LEFT OUTER JOIN이 된 모습이다. 그림에서 보는 것과 같이

왼쪽 테이블에 있는 값 중에서 오른쪽 테이블에 없는 값은 NULL로 표현된다. 

 

RIGHT OUTER JOIN

RIGHT OUTER JOIN은 이름에서 알 수 있듯이 오른쪽 테이블을 기준으로 JOIN 한다.

 

아까의 SQL문에서 LEFT를 RIGHT로 바꿔주기만 하면 된다.

SELECT 
    item.id,
    item.name,
    stock.item_id,
    stock.inventory_count
FROM item RIGHT OUTER JOIN stock 
ON item.id = stock.item_id 

 

 

그런데 결과를 보니 로우수가 줄어들었고 NULL도 보이지 않는다.

그 이유는 stock 테이블의 item_id컬럼이 item 테이블의 id 컬럼의 foregin key 이기 때문이다.

즉, stock 테이블의 item_id컬럼에 있는 값 중에 item 테이블의 id 컬럼에 없는 값이 없기 때문에 NULL이 생길 수가 없다. 

(이것은 Foreign Key를 기준으로 조인해서 그런 것일뿐 꼭 Foreign Key를 기준으로 조인을 해야만 하는 것은 아니다. Foreign Key가 아닌 컬럼을 기준으로 해서 조인할 수 있다.)

 

INNER JOIN

INNER JOIN은 교집합을 생각하면 된다.

 

두 테이블을 INNER JOIN하면 기준이 되는 테이블은 따로 없고, item 테이블의 id 컬럼과 stock 테이블의 item_id 컬럼 중 겹치는 것만 조인해서 보여준다.

 

SELECT 
    item.id,
    item.name,
    stock.item_id,
    stock.inventory_count
FROM item INNER JOIN stock 
ON item.id = stock.item_id 

 

 

그래서 INNER JOIN을 사용하면 NULL 값은 나오지 않는다. 

 

 

 

 

그리고 하나 더 설명하자면, JOIN 조건을 설정할 때, 

ON 대신 USING 도 사용할 수 있다. (만약 조인 조건으로 쓰인 두 컬럼의 이름이 같으면)

 

SELECT 
    old.id,
    new.inventory_count
FROM item AS old INNER JOIN stock AS new
ON old.id = new.id

 

이렇게 ON을 사용해도 되지만, 만약 조인 조건으로 쓰인 두 컬럼의 이름이 같으면

 

SELECT 
    old.id,
    new.inventory_count
FROM item AS old INNER JOIN stock AS new
USING(id)

이렇게 USING을 사용할 수도 있다. ON old.id = new.id 와 USING(id) 은 같은 결과를 보여준다.