더북(TheBook)

ANSI 내부 조인

기존 문법과 ANSI 내부 조인 문법의 차이는 다음과 같다.

<기존 문법>

    SELECT A.컬럼1, A.컬럼2, B.컬럼1, B.컬럼2 ...
      FROM 테이블 A, 테이블 B
     WHERE A.컬럼1 = B.컬럼1 → 조인 조건
    ...;

<ANSI 문법>

    SELECT A.컬럼1, A.컬럼2, B.컬럼1, B.컬럼2 ...
      FROM 테이블 A
     INNER JOIN 테이블 B
        ON ( A.컬럼1 = B.컬럼1) → 조인 조건
    WHERE ...;

2013년 1월 1일 이후에 입사한 사원번호, 사원명, 부서번호, 부서명을 조회하는 쿼리를 비교해 보자.

<기존 문법>

입력

    SELECT a.employee_id, a.emp_name, b.department_id, b.department_name
      FROM employees a,
           departments b
     WHERE a.department_id = b.department_id
       AND a.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');

<ANSI 문법>

입력

    SELECT a.employee_id, a.emp_name, b.department_id, b.department_name
      FROM employees a
     INNER JOIN departments b
        ON (a.department_id = b.department_id )
     WHERE a.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');

ANSI 내부 조인은 FROM절에서 INNER JOIN 구문을 쓴다. 조인 조건은 ON 절에 명시하고, 조인 조건 외의 조건은 기존대로 WHERE 절에 명시한다. 만약 조인 조건 컬럼이 두 테이블 모두 동일하다면 ON 대신 USING 절을 사용할 수 있는데, 이때는 SELECT절에서 조인 조건에 포함된 컬럼명을 테이블명.컬럼명형태가 아닌 컬럼명만 기술해야 한다.

<잘못된 경우>

입력

    SELECT a.employee_id, a.emp_name, b.department_id, b.department_name
      FROM employees a
     INNER JOIN departments b
     USING (department_id)
     WHERE a.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');

결과

    SQL 오류: ORA-25154: USING 절의 열 부분은 식별자를 가질 수 없음.

<잘 된 경우>

입력

    SELECT a.employee_id, a.emp_name, department_id, b.department_name
      FROM employees a
     INNER JOIN departments b
     USING (department_id)
     WHERE a.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');

두 테이블 간 조인 조건에 사용되는 컬럼명이 동일한 경우가 많긴 하지만 다를 때도 있으므로, USING 대신 ON 절을 사용하는 것이 일반적이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.