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로 표현된다.
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를 붙여 편의성을 높일 수 있다.
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'
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이 되는 경우가 발생하기 않는다.