04_ JOIN
중복된 데이터를 줄이면 데이터의 무결성이 보장되며, 저장 공간을 확보 할 수 있다.
JOIN
한 개 이상의 테이블에서 데이터를 조회하기 위해 사용하는 것이며, 수행 결과는 하나의 Result Set으로 나오게 된다.
- 오라클 전용 구문
FROM절에 ‘,’로 구분하여 합치게 될 테이블명을 기술하고 WHERE 절에 합치기에 사용할 컬럼명을 기술한다.
컬럼명이 같은 경우 테이블명을 지정해야 하며, 테이블명에 별칭을 쓸 수 있다.
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
2.ANSI 표준 구문 → 더 유용한 구문이므로 잘 익혀야 한다.
연결에 사용하려는 컬럼명이 같은 경우 USING(컬럼명)을 사용하고, 컬럼명이 같을 경우에는 ON()을 사용한다.
SELECT
EMP_ID
, EMP_NAME
, JOB_CODE
, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
컬럼명이 같은 경우에도 ON으로 작성할 수 있다.
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);
ANSI 표준
EQUAL JOIN : 조인의 기본으로, 연결되는 컬럼 값이 일치하는 행들만 조인
⇒ INNER JOIN
OUTER JOIN : 컬럼 값이 일치하지 않은 행도 조인에 포함시키며, 반드시 OUTER JOIN임을 명시해야 한다.
LEFT OUTER JOIN : 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블을 기준으로 JOIN
RIGHT OUTET JOIN : 합치기에 사용한 두 테이블 중 오른편에 기술된 테이블을 기준으로 JOIN
FULL OUTER JOIN : 모든 행을 결과에 포함하여 JOIN
OUTER 를 생략하고 LEFT JOIN, RIGHT JOIN, FULL JOIN이라 작성할 수 있다.
LEFT JOIN을 오라클 전용 구문에서는 기준에 JOIN 되는 오른쪽 테이블에 (+)를 붙인다.
RIGHT JOIN의 경우에는 반대이며, 오라클 전용 구문에는 FULL JOIN이 없다.
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
CROSS JOIN : 카테이션 곱이라고도 하며, 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법이다.
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
NON EQUAL JOIN : 지정한 컬럼의 값이 일치하는 경우가 아니라 값의 범위에 포함되는 행들을 연결하는 방식.
(조건에 조인한다고 본다.)
오라클 전용 구문을 보면 이해하기 편하다.
ANSI 표준
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE의 SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE의 SAL_LEVEL"
FROM EMPLOYEE E
JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
오라클 전용
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE의 SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE의 SAL_LEVEL"
FROM EMPLOYEE E
, SAL_GRADE S
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;
SELF JOIN : 같은 테이블을 조인하는 경우, 자기 자신과 조인을 맺는 것.
별칭을 다르게 하여 구분한다.
오라클 전용
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원명
, E1.MANAGER_ID
, E2.EMP_NAME 관리자명
FROM EMPLOYEE E1
, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID;
ANSI 표준
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원명
, E1.MANAGER_ID
, E2.EMP_NAME 관리자명
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON( E1.MANAGER_ID = E2.EMP_ID) ;
다중 JOIN : N개의 테이블을 조회할 때 사용한다.
ANCI 표준의 경우 조인 구문 나열 순서에 유의해야 한다. 연쇄적으로 조인해야 함. SELECT 절 마지막 WHERE에 조건을 서술해야 함.
, 오라클은 테이블 서술 순서와 관계없다.
직급이 대리이면서 아시아 지경에 근무하는 직원의 이름, 직급명, 부서명, 근무지역명 조회
ANSI
SELECT
EMP_NAME
, JOB_NAME
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
WHERE JOB_NAME = '대리'
AND LOCAL_NAME LIKE 'ASIA@';
ORACLE 전용
SELECT
E.EMP_NAME
, J.JOB_NAME
, D.DEPT_TITLE
, L.LOCAL_NAME
FROM DEPARTMENT D
, EMPLOYEE E
, JOB J
, LOCATION L
WHERE E.JOB_CODE = J.JOB_CODE
AND E.DEPT_CODE = D.DEPT_ID
AND D.LOCATION_ID = L.LOCAL_CODE
AND JOB_NAME = '대리'
AND LOCAL_NAME LIKE 'ASIA%';