[SQL]조인 - Inner Join & Outer Join
조인이란 여러 테이블에 흩어져 있는 정보 중 사용자가 필요한 정보만 가져와서 가상의 테이블처럼 만들어서 결과를 보여주는 것으로 2개의 테이블을 조합하여 하나의 열로 표현하는 것이다.
INNER JOIN(내부 조인)
INNER JOIN 은 키 값이 있는 테이블의 칼럼 값을 비교 후에 조건에 맞는 값을 가져오는 조인이다. 간단히 말해 서로 연관된 내용만 검색하는 조인방법이다.
- EMPLOYEE TABEL
ID | NAME | DEPARTMENT_ID |
---|---|---|
1 | KIM | 11 |
2 | LEE | 22 |
3 | PARK | 22 |
4 | SONG | 11 |
- DEPARTMENT TABLE
DEPARTMENT_ID | DEPARTMENT_NAME |
---|---|
11 | 영업부 |
22 | 기술부 |
1
2
SELECT * FROM TABLE_A INNER JOIN TABLE_B
ON TABLE_A.DEPARTMENT_ID = TABLE_B.DEPARTMENT_ID;
ID | NAME | DEPARTMENT_ID | DEPARTMENT_NAME |
---|---|---|---|
1 | KIM | 11 | 영업부 |
2 | LEE | 22 | 기술부 |
3 | PARK | 22 | 기술부 |
4 | SONG | 11 | 영업부 |
OUTER JOIN
OUTER JOIN 은 조인하는 여러 테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우 데이터가 있는 쪽 테이블의 내용을 전부 출력하는 방법이다. 즉, 조인 조건에 만족하지 않아도 해당 행을 출력하고 싶을 때 사용할 수 있다.
1. LEFT OUTER JOIN
LEFT OUTER JOIN 은 관계형 데이터베이스에서 사용되는 JOIN 유형 중 하나이다. 이 JOIN 은 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 매칭되는 레코드들을 반환하며, 오른쪽 테이블에 매칭되는 레코드가 없는 경우에는 NULL 값을 채워 반환한다.
이를 통해 왼쪽 테이블의 모든 데이터를 유지하면서 오른쪽 테이블과의 연관 정보를 가져올 수 있다.
1
2
3
SELECT * FROM EMPLOYEE E
LEFT OUTER JOIN DEPARTMENT D
ON E.DEPARTMENTID = D.DEPARTMENTID;
위의 코드는 orders
테이블과 customers
테이블을 결합하며, orders
테이블의 각 레코드에 대해 해당하는 customers
테이블의 레코드가 있다면 해당 고객 이름을 반환하고, 만약 해당하는 고객 레코드가 없다면 NULL 값을 반환한다.
언제 LEFT OUTER JOIN 을 주로 사용할까? 주문 데이블과 고객 테이블이 있을 때, 주문 테이블에는 주문이 있지만 고객 테이블에는 해당 주문과 매칭되는 고객 정보가 없는 경우에 LEFT OUTER JOIN 을 사용할 수 있다. 이렇게 하면 주문 정보를 유지하면서 고객 정보가 없는 주문도 확인할 수 있다.
마찬가지로, 댓글(Comments) 테이블과 이용자(Users) 테이블이 있는 경우를 생각해보자. 댓글 테이블에는 댓글이 있지만, 해당 댓글과 매칭되는 사용자 정보가 없는 경우에도 LEFT OUTER JOIN 을 사용하여 모든 댓글을 가져올 수 있다.
2. RIGHT OUTER JOIN
RIGHT OUTER JOIN은 조인문의 오른쪽에 있는 테이블의 모든 결과를 가져온 후 왼쪽의 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL을 표시한다.
1
2
3
SELECT * FROM EMPLOYEE E
RIGHT OUTER JOIN DEPARTMENT D
ON E.DepartmentID = D.DepartmentID;
실무에서 보다 많이 사용하는 JOIN 은?
RIGTH OUTER JOIN 은 DB에서 LEFT OUTER JOIN 과 유사하게 사용될 수 있지만, 실무에서는 LEFT OUTER JOIN 을 일반적으로 더 많이 사용한다. 이는 DB 설계나 쿼리 작성의 관점에서 LEFT OUTER JOIN 이 보다 직관적으로 사용하기 쉽기 때문이다.
RIGHT OUTER JOIN 은 오른쪽 테이블을 기준으로 모든 레코드를 가져오고 왼쪽 테이블과 일치하는 레코드가 없는 경우에도 결과에 포함된다. 이러한 동작은 LEFT OUTER JOIN 과 반대 방향으로 동작하며 오른쪽 테이블을 기준으로 하기 때문에 결과가 오른쪽에 표시된다.
그리고 RIGHT OUTER JOIN 을 사용하면 왼쪽 테이블이 NULL 인 경우가 많아져서 쿼리의 이해와 유지보수가 어려워질 수 있다.
때문에 DB 시스템에서는 RIGHT OUTER JOIN 보다는 LEFT OUTER JOIN 사용을 권장한다.