LECTURE/Oracle

04_ JOIN

heywoo 2023. 1. 16. 21:53

중복된 데이터를 줄이면 데이터의 무결성이 보장되며, 저장 공간을 확보 할 수 있다.

JOIN

한 개 이상의 테이블에서 데이터를 조회하기 위해 사용하는 것이며, 수행 결과는 하나의 Result Set으로 나오게 된다.

  1. 오라클 전용 구문

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%';