일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- finalize 수동 호출
- 달리기 경주 파이썬 시간초과
- 프로세스
- 알고리즘 1000000007 나누기
- java 동기화
- 빌드관리도구 차이
- 프로그래머스 142086
- 이코테2021
- oracle 조인 방법
- Spring Security 5
- 달리기 경주 파이썬
- 정규화 장단점
- oracle (+) 조인
- 기사단원의 무기 제곱근
- oracle where join
- build.gradle 설정 오류
- OOP의 특징
- 빌드관리도구
- Python 1000000007
- 모듈로 연산
- 백트래킹
- @RequestMapping과 @GetMapping
- Spring Security 버전 문제
- RDBMS와 NoSQL 차이
- commit message convention
- oracle 암시적조인
- PCB
- 기사단원의 무기 파이썬
- DDL DML DCL 차이
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
- Today
- Total
BUILD_SSO
[ORACLE] oracle의 조인 방식, 암시적 조인과 명시적 조인 (where, join..on) 본문
[ORACLE] oracle의 조인 방식, 암시적 조인과 명시적 조인 (where, join..on)
sohyeonnn 2025. 5. 18. 21:45Oracle 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의 기준이 됨)
- (+)가 붙은 테이블은 누락 가능성 있는 서브 테이블
- 반드시 한쪽 조건에만 (+)를 붙여야 하며, 양쪽에 동시에 붙이면 에러 발생
'Programming > SQL | MySQL | ORACLE' 카테고리의 다른 글
[MySQL] 서브쿼리 개념과 활용 (0) | 2023.05.06 |
---|---|
[MySQL] GROUP BY, HAVING, ORDER BY (0) | 2023.05.02 |
[MySQL] LEFT(), RIGHT() 문자열 자르기(추출하기) (0) | 2023.04.21 |