BUILD_SSO

[ORACLE] oracle의 조인 방식, 암시적 조인과 명시적 조인 (where, join..on) 본문

Programming/SQL | MySQL | ORACLE

[ORACLE] oracle의 조인 방식, 암시적 조인과 명시적 조인 (where, join..on)

sohyeonnn 2025. 5. 18. 21:45

Oracle SQL에서 join...on 을 사용하지 않고 from table1 t1, table2 t2 where t1.col1 = t2.col1 형식으로 하는것을 본 적 있을것이다.

이런 형태로 조인을 수행하는 방식을 Lecacy Join 혹은 Implict Join(레거시 조인, 암시적 조인)이라고 부른다.

 

# 암시적 조인( Implicit Join )

SELECT * 
FROM EMP, DEPT 
WHERE EMP.DEPTNO = DEPT.DEPTNO;

 

이 방식은 명시적 조인(JOIN ... ON)이 도입되기 전의 표준이었으며, 현재는 가독성과 유지보수 측면에서 명시적 조인 (Explicit Join) 사용이 권장된다.

 

# 명시적 조인 (Explicit Join)

SELECT * 
FROM EMP 
INNER JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;

 


명시적 조인의 여러가지 형태와 조건을 알아보자면 다음과 같다.

 

# 명시적 조인의 기본 형식

SELECT 컬럼명
FROM 테이블1
[INNER | LEFT OUTER | RIGHT OUTER | FULL OUTER | CROSS] JOIN 테이블2
ON 테이블1.컬럼 = 테이블2.컬럼
[WHERE 추가 조건]

 

 

# INNER JOIN

두 테이블에서 조건이 일치하는 행만 반환한다.

SELECT E.ENAME, D.ENAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

 

# LEFT OUTER JOIN (LEFT JOIN)

왼쪽 테이블의 모든 행 + 오른쪽 테이블에서 일치하는 행 (없으면 NULL반환)

SELECT E.NAME, D.NAME
FROM EMP E
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DETNO;

 

# RIGTH OUTER JOIN(RIGHT JOIN)

오른쪽 테이블의 모든 행 + 왼쪽 테이블에서 일치하는 행 (없으면 NULL반환)

SELECT E.NAME, D.NAME
FROM EMP E
RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

 

# FULL OUTER JOIN

양쪽 테이블의 모든 행을 포함하고, 일치하지 않는 경우 NULL 반환

SELECT E.NAME, D.NAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

 

# CROSS JOIN

카티션 곱(Caresian Product)생성: 모든 조합 반환

SELECT E.NAME, D.NAME
FROM EMP E
CROSS JOIN DEPT D;

 

 

👉🏻 예외case

- outer join에서는 on의 양쪽을 바꾸는 것이 결과에 영향을 줄 수 있다.

-- 왼쪽 기준
SELECT ...
FROM EMP E
LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

-- 오른쪽 기준
SELECT ...
FROM DEPT D
LEFT OUTER JOIN EMP E ON D.DEPTNO = E.DEPTNO;

위의 두 쿼리는 실행결과가 달라진다. 왜냐하면 left join의 기준 테이블이 FROM 뒤에 위치하는 테이블이기 때문이다.

 


암시적 조인에서도 INNER JOIN 처럼 사용하는 경우에는 테이블 나열 순서, 동등기호 나열 순서는 결과에 영향을 주지 않는다. 하지만 OUTER JOIN의 경우에는 순서가 중요하다

 

# 암시적 조인에서의 OUTER JOIN 작성 방식

암시적 조인에서는 (+)연산자로 OUTER JOIN을 나타낸다.

SELECT *
FROM DEPT D, EMP E
WHERE D.DEPTNO = E.DEPTNO(+);

위와 같이 작성한 경우에는 DEPT 기준 LEFT OUTER JOIN이 된다.

DEPT 테이블의 결과가 전부 나오고 EMP가 없으면 NULL을 반환한다.

 

⚠️ 중요한 점

  • Oracle의 (+)는 기호 위치의 반대쪽 테이블이  OUTER임을 나타내는 표기(OUTER JOIN의 기준이 됨)
  • (+)가 붙은 테이블은 누락 가능성 있는 서브 테이블
  • 반드시 한쪽 조건에만 (+)를 붙여야 하며, 양쪽에 동시에 붙이면 에러 발생
Comments