ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - JOIN
    DataBase/Oracle 2022. 1. 20. 21:02
    728x90
    반응형

    JOIN

     한 개 이상의 테이블에서 테이터를 조회하기 위해 사용하는 것으로 수행 결과는 하나의 Result Set으로 나오게 된다. 관계형 데이터베이스에서는 하나의 테이블에서 데이터를 가져오거나 외래키를 참조하여 외래키에 해당하는 테이블의 데이터들도 같이 가져오는 경우가 많다.

     

    • 조인은 기본이 EQUAL JOIN이다 (EQU JOIN이라고도 함)
    • 연결되는 컬럼의 값이 일치하는 행들만 조인된다
    • 일치하는 값이 없는 행은 조인에서 제외 되는 것을 INNER JOIN이라고 한다.
    • JOIN의 기본은 INNER JOIN & EQU JOIN이다.

     

     JOIN구문은 오라클과 ANSI 표준이 있으니 둘 다 알아보도록 하자.

     


     

    오라클 INNER JOIN

     

    • FROM절에 ' , ' 로 구분하여 합치게 될 테이블명을 기술
    • WHERE절에 합치기에 사용할 컬럼명을 명시한다.
    • 두개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행은 조인에서 제외
    • INNER를 명시하지 않아도 INNER JOIN으로 실행된다.

     

     

    연결에 사용할 두 컬럼명이 다른 경우

     

    • 연결할 두 테이블간의 컬럼명의 이름이 다른경우 WHERE절에서 조건을 넣어준다.
    • WHERE절 조건에 따라 EMPLOYEE 테이블과 DEPARTMENT 테이블의 컬럼들이 합쳐진다.

     

    SELECT 
           EMP_ID
         , EMP_NAME
         , DEPT_CODE
         , DEPT_TITLE
      FROM EMPLOYEE
         , DEPARTMENT
     WHERE DEPT_CODE = DEPT_ID;

     

    연결에 사용할 두 컬럼명이 같은 경우

     

    • 연결할 두 테이블간의 컬럼명의 이름이 다른경우
      WHERE절에서 테이블명을 포함하여 조건처리하거나, 별칭을 이용한다.
    • WHERE절 조건에 따라 EMPLOYEE 테이블과 DEPARTMENT 테이블의 컬럼들이 합쳐진다.

     

    --테이블명으로 해당 컬럼 구분
    SELECT
           EMPLOYEE.EMP_ID
         , EMPLOYEE.EMP_NAME
         , EMPLOYEE.JOB_CODE
         , JOB.JOB_NAME
      FROM EMPLOYEE
         , JOB
     WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
     
     -- 테이블명에 별칭 사용
    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;


     

    ANSI 표준 JOIN 구문

     

    • JOIN 키워드를 1개 이상 테이블들의 데이터를 합칠 수 있다.

     

     

    연결에 사용할 두 컬럼명이 같은 경우

     

    • USING(컬럼명)을 사용한다.

     

    SELECT
           EMP_ID
         , EMP_NAME
         , JOB_CODE
         , JOB_NAME
      FROM EMPLOYEE 
      JOIN JOB USING(JOB_CODE);

     

    연결에 사용할 두 컬럼명이 다른 경우

     

    • ON(컬럼명1 = 컬럼명2)를 사용한다.
    • 컬럼명이 같은 경우에도 ON()을 이용해 해당 테이블들을 합칠 수 있다.

     

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

     

     

     

     


     

    오라클  OUTER JOIN

     

    • 두개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행도 조인에 포함
    • OUTER JOIN은 반드시 OUTER JOIN임을 명시해야한다.
    • 종류
      - LEFT OUTER JOIN     -  컬럼 = 컬럼(+)
      - RIGHT OUTER JOIN   -  컬럼(+) = 컬럼
      - FULL OUTER JOIN   
    • 종류

      - LEFT OUTER JOIN   (OUTER 생략 가능)
      - RIGHT OUTER JOIN (OUTER 생략 가능)
      - FULL OUTER JOIN   (OUTER 생략 가능)

     

    LEFT OUTER JOIN

     

    • 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수를 기준으로 JOIN이 된다.
    • 아래 코드는 DEPT_CODE가 EMPLOYEE의 컬럼이고, DEPT_ID가 DEPARTMENT의 컬럼이다.

     

    SELECT
           EMP_NAME
         , DEPT_TITLE
      FROM EMPLOYEE
         , DEPARTMENT
     WHERE DEPT_CODE = DEPT_ID(+);

     

     

    LEFT OUTER JOIN

     

    • 기준이 되는 테이블은 DEPARTMENT

     

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

     

    FULL OUTER JOIN

     

    • 오라클 전용은 FULL OUTER JOIN은 할 수 없다.

     


     

     

     

    ANSI 표준 OUTER JOIN 구문

     

     

    • 두개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행도 조인에 포함
    • OUTER JOIN은 반드시 OUTER JOIN임을 명시해야한다.
    • 종류
      - LEFT OUTER JOIN   (OUTER 생략 가능)
      - RIGHT OUTER JOIN (OUTER 생략 가능)
      - FULL OUTER JOIN   (OUTER 생략 가능)

     

     

    LEFT OUTER JOIN

     

    • 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수를 기준으로 JOIN이 된다.
    • 아래 코드는 DEPT_CODE가 EMPLOYEE의 컬럼이고, DEPT_ID가 DEPARTMENT의 컬럼이다.
    • 기준이 되는 테이블은 EMPLOYEE

     

    -- ANSI 표준
    SELECT
           EMP_NAME
         , DEPT_TITLE
      FROM EMPLOYEE
    --  LEFT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
      LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

     

     

    RIGHT OUTER JOIN

     

    • 기준이 되는 테이블은 DEPARTMENT

     

    -- ANSI 표준
    SELECT
           EMP_NAME
         , DEPT_TITLE
      FROM EMPLOYEE
    --  RIGHT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
      RIGHT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

     

     

    FULL OUTER JOIN

     

    SELECT
           EMP_NAME
         , DEPT_TITLE
      FROM EMPLOYEE
    --  FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
      FULL JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

     

     


     

    그 이외의 조인 구문

     

     

    CROSS JOIN

     

    • 카테이션곱 이라고도 한다.
    • 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법
    • 아래 코드로 설명하면 각 이름마다 모든 부서가 매핑되어 진다. 
      EMP_NAME * DEPT_TITLE의 개수만큼 행이 만들어짐

     

    SELECT
           EMP_NAME
         , DEPT_TITLE
      FROM EMPLOYEE
     CROSS JOIN DEPARTMENT;

     

     

    NON EQUAL JOIN(NON EQU JOIN)

     

    • 지정한 컬럼의 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결
    • 아래 코드는 SALARY  <= SAL_GRADE <= MAX_SAL   값의 범위인 행들을 조인한다고 보면 된다.

     

    -- 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

     

    • 같은 테이블을 조인하는 경우, 즉 자기 자신과 조인을 하는 방법

     

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

    728x90
    반응형

    'DataBase > Oracle' 카테고리의 다른 글

    SQL - RANK, DENSE_RANK  (0) 2022.01.22
    SQL - SUBQUERY  (0) 2022.01.21
    SQL - SET OPERATION  (0) 2022.01.20
    SQL - ROLLUP, CUBE, GROUPING, GROUPING SETS  (0) 2022.01.20
    SQL - ORDER BY, GROUP BY, HAVING  (0) 2022.01.19

    댓글

Designed by Tistory.