728x90
포괄조인 / 외부조인(OUTER JOIN)\
테이블 간의 JOIN 시 일치하지 않는 행도 포함시켜서 조회 가능
단, 반드시 LEFT / RIGHT 를 지정해야 함(기준이 되는 테이블을 지정)
1) LEFT [OUTER] JOIN
[OUTER] 생략 가능
두 테이블 중 왼편에 기술된 테이블의 데이터는 무조건 조회
Oracle 구문
-- "전체" 사원들의 사원명, 급여, 부서명 조회
-- DEPT_CODE 가 NULL 인 두 명의 사원은 조회 안됨
-- 부서에 배정된 사원이 없는 부서(D3, D4, D7)은 조회 안됨
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- 내가 기준으로 삼을 테이블의 컬럼명 반대쪽에 '(+)'를 붙인다.
ANSI 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- -> EMPLOYEE 테이블을 기준으로 조회했기 때문에
-- EMPLOYEE에 존재하는 데이터가 뭐든 조회된다.
728x90
2) RIGHT [OUTER] JOIN
두 테이블의 오른편에 기술된 테이블을 기준으로 JOIN
Oracle 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
ANSI 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
RIGHT OUTER JOIN EMPARTMENT ON (DEPT_CODE = DEPT_ID);
3) FULL [OUTER] JOIN
두 테이블이 가진 모든 행을 조회 (Oracle 불가, ANSI에서만 가능)
Oracle 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+);
-- => 에러 (only one out-joined table)
ANSI 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
728x90