TIL. DB_JOIN

배상건·2022년 4월 11일
0

TIL

목록 보기
7/15
post-thumbnail

1. LEFT OUTER JOIN

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

LEFT OUTER JOIN 은 왼쪽에 있는 item 테이블을 기준으로, 오른쪽의 stock 테이블을 합치라는 뜻이다.

그렇다면, 두 테이블을 어떤 기준으로 합치라는 걸까?
그 기준은 바로 다음 줄에 있는 ON 으로 시작하는 구문이다.

ON item.id = stock.item_id;

이 말은 두 테이블을 합칠 때, item 테이블의 id 컬럼의 값과 Stock 테이블의 item_id 컬럼의 값을 비교해서 서로 값이 같은 로우끼리 가로 방향으로 연결하라는 뜻이다.

이때, 두 테이블의 합쳐진 새로운 테이블의 item_id 컬럼의 값들 중에 null인 값들도 있을 수 있다.

그 이유는 item 테이블의 id 컬럼의 값 중에서
stock 테이블의 item_id 컬럼에는 존재하지 않았던 것들이다.

이런 환경에서 LEFT OUTER JOIN 을 하면
item 테이블에서는 있지만, stock 테이블에 없는 로우는 이런 식으로 NULL로 표현된다.

테이블 이름에 alias 붙이기

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

alias는 컬럼에만 붙일 수 있는 편의기능이 아니다.
수십, 수백개의 테이블이 서로 관계를 맺을 때, 매번 테이블 명을 써준다면, 편의성이 매우 떨어지게 된다.

따라서 join을 할께 테이블에 alias를 붙여 편의성을 높일 수 있다.

테이블에 alias를 붙이는 순서

1) item(테이블) AS i(별명)

FROM item AS i LEFT OUTER JOIN stock AS s

컬럼에 alias를 붙일 때처럼 테이블에 alias를 붙일 때도, 똑같이 AS를 사용하면 된다.
이렇게 alias를 붙이고 나면, 이제 item 테이블은 i로, stock 테이블은 s로 가리킬 수 있다.

2) SQL문에서 테이블 이름이 등장하는 다른 부분들도 모두 alias로 바꿔주는 작업을 해야한다.

SELECT
	i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM item AS i LEFT OUTER JOIN stock AS s
ON item.id = stock.item_id;

이때, 주의 할 것은 FROM 절에서 테이블에 alias를 붙이게 되면, 반드시 다른 모든 절에서 그 테이블은 지정된 alias로만 나타내야 한다는 점이다. 만약 다른 절에서 alias가 아닌 원래 테이블 명을 사용하면 에러가 발생된다.

SELSECT 
	item.id, item.name, 
    item_new.id, item_new.name
FROM item AS old INNER JOIN item_new AS new
ON item.id = item_new.id

Error code: 1054. Unknown column 'item.id' in 'field list'

2. INNER JOIN(교집합)

inner join 은 각 테이블에서 조인 기준으로 사용된 컬럼들의 일치하는 값이
둘 다 존재하는 로우들만 합치는 조인이다.

SELECT
	i.id,
    i.name,
    s.item_id,
    s.inventory_count
FROM item AS i INNER JOIN stock AS s
ON item.id = stock.item_id;


item 테이블과 stock 테이블을 inner join하면
item 테이블의 id 컬럼과 stock 테이블의 item_id 컬럼의 값이 일치하는 로우들만 추려서 합치게 된다. 이 점은 left join, right join과 같다.

그러나, inner join은 두 join과 다르게

inner join은 기준이 되는 테이블이 따로 없다.

ON item.id = item_new.id

단지 두 테이블 모두 기준 컬럼에 일치하는 값이 있는 로우들만 연결되기 때문에, 기준 컬럼이 NULL이 되는 경우가 발생하기 않는다.

profile
목표 지향을 위해 협업하는 개발자

0개의 댓글