프로그래밍/SQL_Oracle

04_OracleDB SQL : JOIN (오라클 전용 구문, ANSI 표준 구문)

pupu91 2022. 7. 19. 20:18
반응형

 

 


JOIN

두 개 이상의 테이블을 하나로 합쳐서 결과를 조회함.

오라클 전용 구문과 ANSI 표준 구문으로 나눔

 

1 . OUTER JOIN

(LEFT, RIGHT,FULL)

2 . NON EQUAL JOIN

3. SELF JOIN

4. 다중 JOIN


 

1. 오라클 전용 구문

 

  • FROM절에 MAIN TABLE명과 JOIN할 TABLE명을 작성하고, WHERE절에 JOIN 할 컬럼명을 작성
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , DEPT_TITLE
  FROM EMPLOYEE 메인 테이블
     , DEPARTMENT 조인할 테이블
 WHERE DEPT_CODE = DEPT_ID; 조인할 컬러명

 

 

 

  • JOIN할 두 컬럼명이 같은 경우에 별칭사용
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 표준 구문

 

  • FROM절에 MAIN 테이블명 JOIN 합치기 할 테이블명  USING(컬럼명) 또는 ON(컬럼명)을 작성함.
  • 연결에 사용할 컬럼명이 같은 경우 USING(컬럼명)을 사용
SELECT
       EMP_ID
     , EMP_NAME
     , JOB_CODE
     , JOB_NAME
  FROM EMPLOYEE
  JOIN JOB USING(JOB_CODE);

 

 

 

 

  • 연결에 사용할 컬럼명이 다른 경우 ON()을 사용
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);

 

 

 

 

 

  • 부서 테이블과 지역 테이블을 조인하여 테이블에 있는 모든 데이터를 조회하기
(1) ANSI 표준 방식
SELECT 
       * 
  FROM DEPARTMENT
  JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);

(2) ORACLE 전용 방식
SELECT 
       * 
  FROM DEPARTMENT D
     , LOCATION L
 WHERE D.LOCATION_ID = L.LOCAL_CODE;

 

 

 

 


OUTER JOIN

 

INNER JOIN : 일치하는 값이 없는 행은 조인에서 제외됨. 묵시적

OUTER JOIN : 컬럼값이 일치하지 않는 행도 조인에 포함시킴. 명시적

 


 

1. LEFT OUTER JOIN

  •  테이블 중 왼편에 기술 된 테이블을 기준으로 JOIN
  • 오라클 구문은 (+)를 사용
(1) ANSI 표준
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
  LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

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

 

 

2. RIGHT OUTER JOIN

  • 두 테이블 중 오른편에 기술 된 테이블을 기준으로 JOIN
(1) ANSI 표준
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
  RIGHT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

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

 

 

3. FULL OUTER JOIN

  • 두 테이블이 가진 모든 행을 결과에 포함하여 JOIN
  • 오라클 전용 구문은 FULL OUTER JOIN 불가능
(1) ANSI 표준
SELECT
       EMP_NAME
     , DEPT_TITLE
  FROM EMPLOYEE
  FULL JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

 


CROSS JOIN

조인되는 테이블의 각 행들이

모두 매핑 된 데이터가 검색되는 방법(카테이션 곱)

 

 


 

 

NON EQUAL JOIN

 

지정한 컬럼의 값이 일치하는 경우가 아닌,

값의 범위에 포함되는 행들을 연결하는 방식

 

(1) 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);

(2) 오라클 전용
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

 

같은 테이블을 조인하는 경우. 자기 자신과 조인을 맺는 것

 

(1)  ANSI 표준
SELECT
       E1.EMP_ID
     , E1.EMP_NAME 사원이름
     , E1.DEPT_CODE
     , E1.MANAGER_ID
     , E2.EMP_NAME 관리자이름
  FROM EMPLOYEE E1
  JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);


(2)오라클 전용
SELECT
       E1.EMP_ID
     , E1.EMP_NAME 사원이름
     , E1.DEPT_CODE
     , E1.MANAGER_ID
     , E2.EMP_NAME 관리자이름
  FROM EMPLOYEE E1
     , EMPLOYEE E2
 WHERE E1.MANAGER_ID = E2.EMP_ID;

 

 

 


 

다중 JOIN

 

N개의 테이블을 조회할 때 사용

ANSI 표준 작성 시 조인 순서를 고려해야함.

ORACLE 전용을 테이블명 서술 순서와 관계가 없음

 

(1)ANSI 표준
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , DEPT_TITLE
     , LOCAL_NAME
  FROM EMPLOYEE
  JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
  JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);

(2)ORACLE 전용
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , DEPT_TITLE
     , LOCAL_NAME
  FROM EMPLOYEE
     , DEPARTMENT
     , LOCATION
 WHERE DEPT_CODE = DEPT_ID
   AND LOCATION_ID = LOCAL_CODE;

 

 


 

 

반응형