SQL,DBMS/Oracle SQL

Oracle Join, ANSI Join

noodle-dev 2025. 12. 9. 22:25

1. ANSI Join

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

 

ref. https://www.codeproject.com/articles/Visual-Representation-of-SQL-Joins#comments-section

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에 대한 컬럼 쪽에 (+)를 기술한다.