DataBase/Oracle

SQL - JOIN

jddng 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
반응형