[SQL] JOIN

업데이트:

JOIN

JOIN은 하나 이상의 테이블에서 데이터를 조회하기 위해 사용하는 구문이다.
수행 결과는 하나의 RESULT SET으로 나온다.

관계형 데이터베이스에서 SQL을 이용해 테이블간 관계를 맺을 수 있는데,
데이터의 무결성을 위해 중복되는 데이터 없이 최소한의 데이터를 테이블에 기록하기 때문에
원하는 정보를 조회하기 위해서 하나 이상의 테이블이 필요한 경우가 많다.

서로 연결된 데이터를 가진 테이블끼리 연결고리를 맺어 필요한 데이터만을 추출하는 것을 JOIN이라고 한다.

INNER JOIN(내부 조인) (== EQAUL JOIN(등가조인))

연결된 컬럼의 값이 일치하는 행들만 조인이 이루어지며, 컬럼 값이 일치하지 않는 행은 조인에서 제외된다.

image



EMPLOYEE, DEPARTMENT 테이블을 참조하여 사번, 이름, 부서코드, 부서명 조회

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

  1. ANSI 방식
    ANSI : 미국 국립 표전 협회

    JOIN 테이블명 ON (컬럼명1 = 컬럼명2)
    SELECT EMP_ID, EMP_NAME, DEPT_ID, DEPT_TITLE
    FROM EMPLOYEE
    /*INNER*/JOIN DEPARTMENT ON ( DEPT_CODE = DEPT_ID);
    
  2. Oracle 방식
    FROM절에 ,로 구분하여 합치게 될 테이블명을 기술하고
    WHERE절에 합치기에 사용할 컬럼명을 명시한다
    SELECT EMP_ID, EMP_NAME, DEPT_ID, DEPT_TITLE
    FROM EMPLOYEE, DEPARTMENT 
    WHERE DEPT_CODE = DEPT_ID;
    



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

  1. ANSI 방식
    JOIN 테이블명 USING(같은 컬럼명)
    SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
    FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE);
    
  2. Oracle 방식
    같은 컬럼명을 구분하기 위해 테이블명으로 구분
    SELECT EMP_ID, EMP_NAME, JOB.JOB_CODE, JOB_NAME
    FROM EMPLOYEE, JOB
    WHERE EMPLOYEE.JOB_CODE=JOB.JOB_CODE;
    

    테이블명에 별칭을 지정하여 구분하는데 사용

    SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
    FROM EMPLOYEE E , JOB J
    WHERE E.JOB_CODE= J.JOB_CODE;
    



OUTER JOIN(외부 조인) == (포괄 조인)

두 테이블의 지정한 컬럼값이 일치하지 않는 행도 조인에 포함 시킨다.
OUTER JOIN은 반드시 명시해야 한다.

LEFT [OUTER] JOIN
합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 모든 컬럼을 기준으로 조인한다.
(NULL 제외하지 않음)

image

  1. ANSI 방식
    SELECT EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE
    LEFT /*OUTER*/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
    
  2. Oracle 방식
    왼쪽 컬럼을 기준으로 하여 오른쪽 컬럼을 맞춰서 추가한다.
    두번째 테이블 컬럼명에 +를 붙여줘야 한다.
    SELECT EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE, DEPARTMENT
    WHERE DEPT_CODE = DEPT_ID(+);
    



RIGHT [OUTER] JOIN
합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 모든 컬럼을 기준으로 조인한다.
(NULL 제외하지 않음)

image

  1. ANSI 방식
    SELECT EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE
    RIGHT /*OUTER*/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
    
  2. Oracle 방식
    왼쪽 컬럼을 기준으로 하여 오른쪽 컬럼을 맞춰서 추가한다.
    첫번째 테이블 컬럼명에 +를 붙여줘야 한다.
    SELECT EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE, DEPARTMENT
    WHERE DEPT_CODE(+) = DEPT_ID;
    



FULL [OUTER] JOIN
합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함한다.
LEFT 합집합 RIGHT 과 같다.
image

  1. ANSI 방식
    SELECT EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE
    FULL /*OUTER*/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
    
  2. Oracle 방식
    오라클은 FULL OUTER JOIN 사용 안 됨.



CROSS JOIN(교차 조인) (== CARTESIAN PRODUCT, 곱집합)

조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법이다.
왼쪽 테이블의 데이터 1개당 오른쪽 테이블 데이터를 처음부터 끝까지 하나씩 결합한다.(모든 경우의 수)

SELECT EMP_NAME FROM EMPLOYEE; --23행
SELECT DEPT_TITLE FROM DEPARTMENT; --9행

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT; -- 207행(23*9)



NON EQAUL JOIN(비등가 조인)

’=’(등호)를 사용하지 않는 조인문이다.
지정한 컬럼 값이 일치하는 경우(등가)가 아닌 지정한 컬럼 값이 일정 범위 내에 포함되는 값일 경우 조인을 수행한다.

SELECT EMP_NAME, SALARY, EMPLOYEE.SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);



SELF JOIN(자체 조인)

같은 테이블을 조인하며, 동일한 테이블 두 개를 조인하는 모양이다.

EMPLOYEE 테이블에서 사번, 이름, 관리자 사번, 관리자 이름 조회

  1. ANSI 방식
    SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID"관리자 사번", M.EMP_NAME"관리자 이름"
    FROM EMPLOYEE E
    JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID); -- 15행 (INNER JOIN)
    --LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID); -- 23행(LEFT OUTER JOIN) NULL값 포함
    
  2. Oracle 방식
    SELECT E.EMP_ID, E.EMP_NAME, E.MANAGER_ID"관리자 사번", M.EMP_NAME"관리자 이름"
    FROM EMPLOYEE E, EMPLOYEE M
    --WHERE E.MANAGER_ID = M.EMP_ID;  -- 15행 (등가 조인)
    WHERE E.MANAGER_ID = M.EMP_ID(+); --23행 (왼쪽 포괄 조인)
    



NATURAL JOIN(자연 조인)

조인할려는 두 테이블이 동일한 타입과 이름을 가진 컬럼이 있다면 자동적으로 조인이 이루어 지도록 하는 구문이다.
반드시 동일한 타입과 이름의 컬럼이 있어야하며, 해당 조건이 만족되지 않으면 CROSS JOIN이 일어난다.

  1. ANSI 방식
    SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
    FROM EMPLOYEE
    JOIN JOB USING (JOB_CODE);
    
    SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
    FROM EMPLOYEE
    NATURAL JOIN JOB;
    
  2. Oracle 방식 NATURAL JOIN은 사용하지 못 한다.



다중 조인

N개의 테이블을 조인할 때 사용하며 조인 순서가 매우 중요하다.

  1. ANSI 방식
    SELECT EMP_ID, EMP_NAME, 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_TITLE, LOCAL_NAME
    FROM EMPLOYEE, DEPARTMENT, LOCATION
    WHERE DEPT_CODE = DEPT_ID 
    AND LOCATION_ID = LOCAL_CODE;
    



태그:

카테고리:

업데이트:

댓글남기기