본문 바로가기

Study

[Oracle/오라클] 조인 (INNER JOIN / OUTER JOIN)

 

JOIN

두 개 이상의 테이블에서 데이터를 조회하고자 할 때 사용되는 구문

조회 결과는 하나의 결과물(RESULT SET)로 나옴

 

 

- 내부 조인 (INNER JOIN)

연결시키는 컬럼의 값이 일치하는 행들만 조인돼서 조회 

 

>> 오라클 전용 구문

FROM 절에 조회하고자 하는 테이블을 나열하고, WHERE 절에 매칭시킬 컬럼에 대한 조건 제시

 

-- 사원들의 사원번호와 직원명, 직급코드, 직급명 조회

-- 테이블명을 이용하는 방법
SELECT EMP_ID, EMP_NAME, JOB.JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;

-- 테이블에 별칭을 부여해서 이용하는 방법
SELECT EMP_ID, EMP_NAME, J.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

 

>> ANSI 구문

FROM 절에 기준이 되는 테이블을 기술한 후

JOIN 절에 같이 조회되고자 하는 테이블 기술 + 매칭시킬 컬럼에 대한 조건 기술

* JOIN USING은 두 컬럼명이 일치할 때만 사용 가능

 

-- 테이블명 또는 별칭을 이용해서 하는 방법
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);

-- JOIN USING 구문 사용하는 방법 
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);

 

 

 

- 외부 조인 (OUTER JOIN)

두 테이블 간의 JOIN 시 일치하지 않는 행도 포함시켜서 조회 가능

단 반드시 LEFT / RIGHT 지정해야 한다 (기준이 되는 테이블)

 

>> LEFT [OUTER] JOIN : 두 테이블 중 왼편에 기술된 테이블 기준으로 JOIN

-- 사원명, 부서명, 급여, 연봉 조회

-- ANSI 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE 
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-- 오라클 전용 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);

-- EMPLOYEE에 있는 건 다 조회됨

 

 

>> RIGHT [OUTER] JOIN : 두 테이블 중 오른편에 기술된 테이블을 기준으로 JOIN

-- 사원명, 부서명, 급여, 연봉 조회

-- ANSI 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE 
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-- 오라클 전용 구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;

-- DEPARTMENT에 있는 건 다 조회됨

 

 

>> FULL [OUTER] JOIN : 두 테이블이 가진 모든 행을 조회할 수 있음 (단, 오라클전용구문 안됨)

-- 사원명, 부서명, 급여, 연봉 조회
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12
FROM EMPLOYEE 
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

 

 

 

- 자체 조인 (SELF JOIN)

같은 데이블을 다시 한번 조인하는 경우

-- 사번, 사원명, 부서코드, 사수의 사번, 사수명, 사수의 부서코드 조회

-- 오라클 전용 구문
SELECT E.EMP_ID, E.EMP_NAME, E.DEPT_CODE,
       M.EMP_ID, M.EMP_NAME, M.DEPT_CODE
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID;

-- ANSI 구문
SELECT E.EMP_ID, E.EMP_NAME, E.DEPT_CODE,
       M.EMP_ID, M.EMP_NAME, M.DEPT_CODE
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID);

 

 

 

- 다중 JOIN

2개 이상의 테이블을 JOIN 할 때

-- 사번, 사원명, 부서명, 직급명 조회

-- 오라클 전용 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE E, DEPARTMENT D, JOB J
WHERE DEPT_CODE = DEPT_ID
AND E.JOB_CODE = J.JOB_CODE;

-- ANSI 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE E
JOIN DEPARTMENT D ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE);

 

-- 사번, 사원명, 부서명, 지역명 조회 

-- 오라클 전용 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;

-- ANSI 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);