Oracle Join, ANSI Join
1. ANSI Join
안시 조인은 일반적으로 알고 있는 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, INNER JOIN, CROSS JOIN 등으로 조인하는 방법이다.

A. INNER JOIN
각 테이블에서 조건에 일치하는 데이터만 조회한다.
집합 개념으로 보면 교집합에 해당한다.
SELECT *
FROM TABLE_A T1
INNER JOIN TABLE_B T2
ON T1.ID = T2.ID
B. OUTER JOIN
조건에 일치하는 데이터, 조건에 일치하지 않는 데이터 모두 가져온다.
1) LEFT OUTER JOIN
왼쪽 테이블을 메인 테이블로 하여
왼쪽 테이블 데이터는 모두 가져오고, 오른쪽 테이블 데이터는 조건에 해당하는 데이터만 가져오고 없으면 NULL로 조회된다.
SELECT *
FROM TABLE_A T1
LEFT OUTER JOIN TABLE_B T2
ON T1.ID = T2.ID
2) RIGHT OUTER JOIN
오른쪽 테이블을 메인 테이블로 하여
오른쪽 테이블 데이터는 모두 가져오고, 왼쪽 테이블 데이터는 조건에 해당하는 데이터만 가져오고 없으면 NULL로 조회된다.
SELECT *
FROM TABLE_A T1
RIGHT OUTER JOIN TABLE_B T2
ON T1.ID = T2.ID
3) FULL OUTER JOIN
왼쪽, 오른쪽 테이블 모두를 메인으로 하여
모든 데이터를 가져오고 조건에 맞지 않는 데이터는 각자 NULL로 조회한다.
SELECT *
FROM TABLE_A T1
FULL OUTER JOIN TABLE_B T2
ON T1.ID = T2.ID
C. CROSS JOIN
모든 경우의 수를 조회한다.
별도 조인 조건이 없다.
왼쪽 테이블 레코드가 n개, 오른쪽 테이블 레코드가 m개라면 CROSS JOIN하여 조회 시 최종적으로 n*m개의 레코드가 조회된다.
SELECT *
FROM TABLE_A T1
CROSS JOIN TABLE_B T2
2. Oracle Join
FROM 절에 테이블 모두 기술하고
WHERE절에 JOIN조건을 명시하는 구조이다.
ORACLE JOIN은 FULL OUTER JOIN이 불가능하다.
A. INNER JOIN
SELECT *
FROM TABLE_A T1,
TABLE_B T2
WHERE T1.ID = T2.ID
INNER JOIN은 (+) 표시가 없다.
B. OUTER JOIN
1) LEFT OUTER JOIN
SELECT *
FROM TABLE_A T1,
TABLE_B T2
WHERE T1.ID = T2.ID (+)
LEFT OUTER JOIN일 경우, WHERE 절의 JOIN 조건 중 오른쪽 테이블 컬럼 쪽에 (+)를 붙이면 된다.
2) RIGHT OUTER JOIN
SELECT *
FROM TABLE_A T1,
TABLE_B T2
WHERE T1.ID (+) = T2.ID
RIGHT OUTER JOIN일 경우, WHERE 절의 JOIN 조건 중 왼쪽 테이블 컬럼 쪽에 (+)를 붙이면 된다.
C. CROSS JOIN
SELECT *
FROM TABLE_A T1,
TABLE_B T2
CROSS JOIN은 조인 조건이 없다.
D. 심화: WHERE절에서 메인이 아닌 테이블에 대한 조건을 거는 경우
만약 WHERE 조건에 T2 컬럼에 대한 조건을 거는 경우,
SELECT *
FROM TABLE_A T1,
TABLE_B T2
WHERE T1.ID = T2.ID (+)
AND T2.SEND_YN = 'Y'
이렇게 하면 T2.SEND_YN 이 NULL인 레코드는 모두 제외된다.
T2에 대한 컬럼이 NULL인 경우도 가져오고 싶다면
SELECT *
FROM TABLE_A T1,
TABLE_B T2
WHERE T1.ID = T2.ID (+)
AND T2.SEND_YN(+) = 'Y'
T2에 대한 컬럼 쪽에 (+)를 기술한다.