Oracle SQL

ORACLE_SQL_JOIN[2]

climb-up 2022. 3. 17. 21:36

<JOIN[1]와 다른 JOIN의 종류 정리>

JOIN 종류

1) NON-EQUI (비등가 조인)

2) SELF JOIN (자체 조인)

3) MULTIPLE JOINS (다중 조인)

 

1) NON-EQUI (비등가 조인)

-JOIN ON(비교 연산자)

 

<예시1>

-EMPLOYEE에 SAL_LAVEL이 없다는 전제하에 급여 등급을 조회.

SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL
FROM EMPLOYEE
	JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
  --JOIN SAL_GRADE ON(SLALRY >= MIN_SAL AND SALARY <= MAX_SAL); 이 방법도 가능

JOIN ON(비교 연산자)로 최소급여와 최대급여 사이를 조회해서 직원 전체의 등급을 조회할 수 있다.

 

2) SELF JOIN (자체 조인)

-같은 테이블 조인(다른 테이블 X)

 

<예시2>오라클 전용 구문

-각 사원의 관리자 조회.

SELECT E.EMP_ID, E.EMP_NAME, E.DEPT_CODE, E.MANAGER_ID, M.EMP_NAME 관리자이름
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID
ORDER BY EMP_ID;

 

NULL값은 빠지고 사원과 사원관리자를 한눈에 볼 수 있다.

 

<예시3>ANSI 전용 구문

SELECT E.EMP_ID, E.EMP_NAME 사원이름, E.DEPT_CODE, E.MANAGER_ID, M.EMP_NAME 관리자이름
FROM EMPLOYEE E
	JOIN EMPLOYEE M ON(E.MANAGER_ID = M.EMP_ID)
ORDER BY EMP_ID;

<예시2>와 같은 코드

 

3) MULTIPLE JOINS (다중 조인)

2개 이상의 테이블 조인.

 

<예시4>오라클 전용 구문.

-사번, 이름, 부서코드, 부서 명, 지역 이름 조회

SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE E, DEPARTMENT D, LOCATION L
WHERE DEPT_CODE = DEPT_ID--EMPLOYEE와 DEPARTMENT 연결
	  AND LOCATION_ID = LOCAL_CODE;--DEPARTMENT와 LOCATION 연결

테이블이 3개 이기때문에 1,2,3 --> 1과2 연결, 2와 3연결 해서 3개가 모두 연결되어있어야 한다.

WHERE절에 순서 바꾸기 문제 없음.

 

<예시5>ANSI 전용 구문.

SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE E
	JOIN DEPARTMENT D ON(DEPT_CODE = DEPT_ID)
	JOIN LOCATION L ON(LOCATION_ID = LOCAL_CODE);

<예시4>와 같은 코드

 

<예시6>오라클 구문

직급이 대리이면서 아시아 지역에 근무하는 직원 사번, 이름, 직급 명, 부서 명, 근무 지역 명, 급여조회. 

SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME, SALARY
FROM EMPLOYEE E, JOB J, DEPARTMENT D, LOCATION
WHERE E.JOB_CODE = J.JOB_CODE
	AND LOCATION_ID = LOCATION_CODE
    AND DEPT_ID = DEPT_CODE
    AND JOB_NAME = '대리'--직급이 대리
    AND LOCAL_NAME LIKE 'ASIA%'--아시아 지역에 근무

<예시7>ANSI 구문

SELECT EMP_ID, EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME, SALARY
FROM EMPLOYEE E
	JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE)
    JOIN DEPARTMENT D ON(DEPT_ID = DEPT_CODE)
   	JOIN LOCATION L ON(LOCATION_ID = LOCAL_CODE)
WHERE JOB_NAME = '대리' AND LOCAL_NAME LIKE 'ASIA%';

<예시6>와 같은 코드