관계형 데이터베이스라는 이름값을 하기 위해 필요한 기능이 JOIN과 UNION입니다. JOIN은 서로 다른 두 테이블을 행 단위로 결합하는 기능이고, UNION은 성격이 같은 테이블을 열 단위로 병합하는 기능입니다. 두 기능에 대해 알아보겠습니다.
아래에 두 테이블이 있습니다. 첫 번째 테이블은 유저 세션 정보를 담은 테이블(user)이고, 두 번째 테이블은 상품 정보를 담은 테이블(item)입니다.
총 세 가지 방식으로 JOIN을 할 수 있는데요. 첫 번째 JOIN은 LEFT OUTER JOIN입니다. LEFT 왼쪽을 기준으로 두 테이블을 결합하겠다는 의미이고, OUTER는 INNER와 반대되는 개념으로 사용됩니다. LEFT, RIGHT JOIN은 그 특성 상 INNER가 아닐 수 밖에 없는데요. 이건 INNER에서 다시 설명하겠습니다.
두 테이블을 JOIN 해보겠습니다. 어떤 칼럼을 기준을로 JOIN할지 정하는 게 중요합니다. 결합하려는 테이블 간에 서로 참조하고 있는 정보가 있는지 확인합니다. 위의 예시에서는 user 테이블의 Item_Id 칼럼이 item 테이블의 ID 칼럼을 참조하고 있습니다.
SELECT u.User_Id, u.Item_Id, i.NAME, i.Brand
FROM users as u LEFT OUTER JOIN item as i
ON u.Item_Id = i.ID
차근차근 살펴보겠습니다. SELECT에서 출력할 열을 명시하고 있습니다. alias로 해당 칼럼이 어느 테이블에 있는지 꼭 지정해줘야 합니다. 또한 alias를 지정했다면 테이블을 명시할 때는 alias로만 호출해야 합니다.
두 번째 줄에서는 어떤 테이블이 어떤 방식으로 JOIN하는지 명시했습니다. user 테이블과 item 테이블이 LEFT OUTER 방식으로 JOIN하고 alias는 각각 u와 i입니다.
마지막 줄에서는 어떤 칼럼을 기준(ON)으로 결합할 것인지 정합니다. 서로 참조하고 있는 열을 사용합니다. 앞서 말한대로 user 테이블의 Item_Id 칼럼이 item 테이블의 ID 칼럼을 참조하고 있습니다. 두 칼럼이 같은 정보(=)라는 것을 기술합니다.
결합 결과입니다. 왼쪽 테이블을 기준으로 결합했기 때문에 왼쪽 테이블에는 있지만 오른쪽 테이블에는 없는 정보는 Null로 처리됩니다. 또한 오른쪽 테이블에만 있는 정보는 결합에서 제외됩니다.
원리는 LEFT JOIN과 같습니다. 기준만 바뀝니다.
SELECT u.User_Id, u.Item_Id, i.NAME, i.Brand
FROM users as u RIGHT OUTER JOIN item as i
ON u.Item_Id = i.ID
LEFT 대신 RIGHT를 쓰면 나머지는 LEFT JOIN과 같습니다. 결과는 다음과 같습니다.
오른쪽 테이블에만 있고 왼쪽 테이블에는 없는 정보는 NULL 처리됩니다. 반대로 왼쪽 테이블에만 있는 정보는 결합에서 제외됩니다. '붙을 곳이 없다!'고 이해하면 좋을 것 같습니다. 나머지 공통된 부분은 잘 결합되었습니다.
이제 INNER JOIN이 남았습니다. INNER는 서로 겹치는 row에 대해서만 결합을 하는 기능입니다.
SELECT u.User_Id, u.Item_Id, i.NAME, i.Brand
FROM users as u INNER JOIN item as i
ON u.Item_Id = i.ID
공통된 row를 기준으로 결합하기 때문에 기준이 되는 테이블이 없습니다. LEFT 또는 RIGHT 대신 INNER JOIN을 쓰면 됩니다. 비교적 간단한 개념이기 때문에 바로 결과를 살펴보겠습니다.