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 절을 사용하는 것이 일반적이다.