INNER JOIN 과 OUTER JOIN 및 SELF JOIN 은 꼭 알아두어야 한다.
CROSS JOIN 과 NON EQU JOIN 은 사용할 일이 거의 없다.
- 오라클 전용 구문
- ANSI 표준 구문
- INNER JOIN - 내부 조인 또는 등가 조인
- OUTER JOIN - 외부 조인 또는 등가 조인
- CROSS JOIN - 교차 조인
- NON EQU JOIN - 비등가 조인
- SELF JOIN - 자체 조인
- 다중 조인
- 자연 조인
하나 이상의 테이블에서 데이터를 조회하기 위해 사용하며
수행 결과는 하나의 Result Set 으로 나온다.
WHERE 절을 이용하며 JOIN 단어는 사용하지 않는다.
ANSI 는 American National Standards Institute 의 약자로
호환성이 좋기 때문에 주로 사용한다.
서로 같은 값을 가지고 있는 컬럼이다라고 명시하는 문장이다.
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
다음은 내부 조인과 외부 조인이다.
오라클 방식과 ANSI 방식으로 사용할 수 있다.
연결되는 컬럼의 값이 일치하는 행들만 조인된다.
이 때 일치하는 값이 없는 행은 조인에서 제외된다. 따라서 NULL 값은 제외된다.
-- ANSI : ON 사용
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
-- 오라클 : JOIN 단어를 작성하지않음
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
-- ANSI : USING 사용
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB ON (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;
두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킨다.
따라서 NULL 값을 포함한다.
합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 컬럼 수를 기준으로 조인한다.
즉 왼편에 기술된 모든 컬럼이 최종 결과에 포함되어야 한다.
-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE LEFT /* OUTER */ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
오라클 구문은 왼쪽 테이블 컬럼의 값과 오른쪽 테이블 컬럼의 값이 일치하지 않아도 억지로 추가해라 라고 해석하면 된다.
합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 컬럼 수를 기준으로 조인한다.
즉 오른편에 기술된 모든 컬럼이 최종 결과에 포함되어야 한다.
-- ANSI
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE /* OUTER */ RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함한다.
즉 양쪽 테이블에서 INNER JOIN 에 포함되지 못한 행 모두를 결과에 포함한다.
-- ANSI
SELECT EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 오라클 구문에서는 지원하지 않음
조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법이다.
즉 모든 경우의 수를 만들어준다.
비등가 조인으로 등호를 사용하지 않는다.
지정한 컬럼 값이 일치하는 경우가 아닌 값의 범위에 포함되는 행들을 연결하는 방식이다.
예를 들어 EMPLOYEE 테이블에서 선동일씨의 SALARY 값인 800 을 가져와서 이 값이 BETWEEN 문으로 나타낸 범위 중 어디에 있는 것인지 묻고 해당 범위에 맞다면 조인해서 보여준다.
같은 테이블을 조인하는 것으로 자기 자신과 조인을 맺는다.
하나의 테이블 가지고 생각하지 말고 같은 테이블이 두 개 있다고 생각하면 쉽다.
사용법은 다음과 같다.
-- ANSI
SELECT EMP.EMP_ID, EMP.EMP_NAME, NVL(EMP.MANAGER_ID, '없음'), NVL(MGR.EMP_NAME, '없음')
FROM EMPLOYEE EMP
LEFT JOIN EMPLOYEE MGR ON(EMP.MANAGER_ID = MGR.EMP_ID);
-- 오라클
SELECT EMP.EMP_ID, EMP.EMP_NAME, NVL(EMP.MANAGER_ID, '없음'), NVL(MGR.EMP_NAME, '없음')
FROM EMPLOYEE EMP, EMPLOYEE MGR
WHERE EMP.MANAGER_ID = MGR.EMP_ID(+);
N 개의 테이블을 조회할 때 사용하며 순서가 중요하다.
동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 표현하는 방법이다.
반드시 두 테이블 간의 동일한 컬럼명과 타입을 가진 컬럼이 필요하다.
-- NATURAL JOIN 성립
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
-- JOIN JOB USING(JOB_CODE);
NATURAL JOIN JOB;
-- NATURAL JOIN 성립 불가
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN DEPARTMENT;