[ORACLE] 데이터 베이스의 조인

조인은 데이터 베이스의 여러 테이블에서 원하는 값을 한번에 조회하기 위해 사용하는 방법이다. 조인은 테이블과 테이블을 붙여(join) 원하는 결과를 만들어낼 수 있다. 서로다른 테이블의 상관 관계를 찾아 로우를 연결한다.


JOIN의 종류

  • INNER JOIN
  • CROSS JOIN (카티션 프로덕트)
  • OUTER JOIN
  • SELF JOIN


모든 조인 방법은 ANSI SQL 방법과 ORACLE SQL 오라클에서 사용하는 방법이 있다. 두가지 모두 같은 방법이지만, 따로 설명을 하기 위해 모두 적은 것이니 참고만 하기 바란다.

INNER JOIN

INEER JOIN 을 하면 두 테이블을 묶어서 하나의 결과 집합을 나타낸다. 두 개 이상의 테이블로 부터 조인 조건을 만족하는 데이터만을 반환한다.

-- ANSI SQL
SELECT EMPLOYEE_ID, FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID,
    DEPARTMENT_NAME, LOCATION_ID
FROM EMPLOYEES A INNER JOIN DEPARTMENTS B
    ON A.DEPARTMENT_ID = B.DEPARTMENT_ID; -- ON 조건문 사용

SELECT EMPLOYEE_ID, FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID,
    DEPARTMENT_NAME, LOCATION_ID
FROM EMPLOYEES A INNER JOIN DEPARTMENTS B
    USING(DEPARTMENT_ID); -- USING(컬럼) 사용

-- ORACLE SQL
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
    AND LAST_NAME='King';

EMPLOYEES 테이블에 DEPARTMENT_ID와 DEPARTMENTS 테이블에 DEPARTMENT_ID가 같은 row를 조인(연결)하여 새로운 테이블을 만든다.


CROSS JOIN

테이블 하나의 ROW 에 다른 테이블 모든 ROW를 조인한 테이블이 생성된다. 생성된 테이블의 ROW는 두 테이블의 ROW를 곱한 값과 같다. 하지만, 자주 사용되지는 않는다.

cross join

--ANSI SQL
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID,
    B.DEPARTMENT_ID, B.DEPARTMENT_NAME, B.LOCATION_ID
FROM EMPLOYEES A CROSS JOIN DEPARTMENTS B;

--ORACLE SQL
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID,
    B.DEPARTMENT_ID, B.DEPARTMENT_NAME, B.LOCATION_ID
FROM EMPLOYEES A, DEPARTMENTS B;


OUTER JOIN

조인 조건을 만족하지 않는 데이터 까지 모두 출력하고자 만든 조인 방법이다. 조인 조건을 만족하면 값을 조인하고, 그렇지 않으면 null을 조인한다.

LEFT OUTER JOIN

LEFT OUTER JOIN을 하면 조건에 따라 왼쪽에 있는 테이블에 오른쪽에 있는 테이블의 ROW를 결합한다. 생성되는 테이블의 ROW는 왼쪽 테이블의 ROW와 같다.

--OUTER JOIN
--ANSI
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID
FROM EMPLOYEES A LEFT OUTER JOIN DEPARTMENTS B
    ON A.DEPARTMENT_ID = B.DEPARTMENT_ID;

SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID
FROM EMPLOYEES A LEFT OUTER JOIN DEPARTMENTS B
    ON A.DEPARTMENT_ID = B.DEPARTMENT_ID
WHERE A.DEPARTMENT_ID IS NULL;

--ORACLE
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID
FROM EMPLOYEES A, DEPARTMENTS B
    WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID(+);

RIGHT OUTER JOIN

--[[ OUTER JOIN
--ANSI
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID
FROM EMPLOYEES A RIGHT OUTER JOIN DEPARTMENTS B
    ON A.DEPARTMENT_ID = B.DEPARTMENT_ID;

SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID
FROM EMPLOYEES A RIGHT OUTER JOIN DEPARTMENTS B
    ON A.DEPARTMENT_ID = B.DEPARTMENT_ID
WHERE A.DEPARTMENT_ID IS NULL;

--ORACLE
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.DEPARTMENT_ID, B.DEPARTMENT_ID
FROM EMPLOYEES A, DEPARTMENTS B
    WHERE A.DEPARTMENT_ID(+) = B.DEPARTMENT_ID;


SELF JOIN

이름 그대로 자기 자신에게 조인을 하는 방법이다.

-- SELF JOIN
SELECT A.EMPLOYEE_ID, A.FIRST_NAME, A.MANAGER_ID,
    B.EMPLOYEE_ID, B.FIRST_NAME, B.MANAGER_ID
FROM EMPLOYEES A, EMPLOYEES B
WHERE A.MANAGER_ID=B.EMPLOYEE_ID;

같은 테이블에 대해 조인을 한다. 결과적으로 자기 자신에게 조인을 하는 효과를 얻는다.

Comments