[ORACLE 초급] 문법별 JOIN 사용법 - 내부조인, 외부조인, JOIN ~ USING/ON
Programming/Database

[ORACLE 초급] 문법별 JOIN 사용법 - 내부조인, 외부조인, JOIN ~ USING/ON

728x90
반응형

조인

두 개 이상의 테이블을 연결하여 하나의 테이블처럼 출력할 때 사용

FROM절에 여러 개의 테이블을 쉼표(,)로 구분자를 이용해 지정 (서브쿼리, 뷰 등이 이에 해당)

SELECT
FROM 테이블1, 테이블2, ..., 테이블N
-- 크로스 조인, 교차 조인 (모든 원소의 순서쌍)
SELECT *
FROM EMP, DEPT;

위처럼 조인 조건이 없을 때 문제점?
결과로 나올 수 있는 모든 행을 조합하기 때문에 두 테이블의 데이터가 맞아 떨어지지 않아도 출력됨
따라서, 어떤 데이터를 연결해야 하는지 기준을 정해줘야 함! (WHERE절의 중요성)
⇒ 테이블이름.열이름

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

테이블 별칭

테이블 이름에서 한칸 띄운 후 별칭 지정

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

SELECT절의 *
한 번에 모든 열을 출력할 수 있다.
하지만, 어떤 열이 어떤 순서로 출력될지도 명확히 알 수 없고, 변화와 감지에 따른 프로그램 수정이 쉽지 않을 수 있기에 *를 사용하지 않고 출력할 열을 하나하나 직접 명시하는 것이 좋다.

 

조인 종류 (ANSI 문법)

등가 조인

= 내부 조인, 단순 조인

테이블을 연결한 후 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식 (일반적인 방식)

✏ 여러 테이블의 열 이름이 같을 때?
어느 테이블에 속해 있는지 테이블 구분을 명시해야 한다. (TABLE.COLUMN)
⇒ 겹치지 않는 열 이름이라도 명시하는 것이 좋음!

✏ 조인할 테이블 개수와 조건식 개수?
테이블 수보다 하나 적은 수만큼의 테이블 연결 조건식이 있어야 한다.

SELECT E.EMPNO, E.ENAME, E.SAL, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
          AND SAL >= 3000;

비등가 조인

등가 조인 방식 외의 방식 (자주 사용하는 방식은 아님)

-- 최소 급여와 최대 급여 사이에 있는 사원의 급여 금액 (일치 여부가 아닌 범위를 지정하는 조건식으로 조인)
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

자체 조인

하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식 (자기 자신의 테이블을 조인)

-- 사원 정보와 직속 상관 정보 출력
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;

=> 결과에 MGR이 NULL인 행은 제외되어 출력 (내부 조인)

외부 조인

조인 조건 데이터 중 어느 한쪽이 NULL이라도 결과를 출력해야하는 경우에 사용
(내부 조인(등가, 자체 조인 포함) <-> 외부 조인(아우터 조인))

조인 기준 한 쪽에 (+) 기호 붙여줌
Left Outer Join : WHERE T1.COL = T2.COL(+)
Right Outer Join : WHERE T1.COL(+) = T2.COL

-- 왼쪽 외부 조인
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+);

=> 왼쪽 열을 기준으로 오른쪽 열의 데이터 존재 여부에 상관없이 출력

-- 오른쪽 외부 조인
SELECT E1.EMPNO, E1.ENAME, E1.MGR, E2.EMPNO AS MGR_EMPNO, E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+) = E2.EMPNO;

=> 오른쪽 열을 기준으로 왼쪽 열의 데이터 존재 여부에 상관없이 출력

 

SQL-99 표준 문법

NATURAL JOIN

등가 조인을 대신해 사용하는 조인 방식
두 테이블에 이름과 자료형이 같은 열을 찾으 후 그 열을 기준으로 등가 조인을 하는 방식

-- 자동으로 DEPTNO 열을 기준으로 등가 조인됨 (테이블 이름을 붙이면 안되는 특성을 지님)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, DEPTNO, D.DNAME, D.LOC
FROM EMP E NATURAL JOIN DEPT D;

JOIN ~ USING

등가 조인을 대신해 사용하는 조인 방식
USING 키워드에 조인 기준으로 사용할 열을 명시

-- (테이블 이름을 붙이면 안되는 특성을 지님)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D USING(DEPTNO);

JOIN ~ ON

WHERE절에 있는 조건식을 ON 키워드에 작성 (조인 기준 조건식을 ON에 명시, 출력 조건식은 WHERE절에 사용)

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E JOIN DEPT D ON(E.DEPTNO = D.DEPTNO);

OUTER JOIN

=외부 조인
WHERE절에 있는 조건식을 FROM절의 ON 키워드에 작성

-- 🎵 기존 방식과의 차이점

**LEFT OUTER JOIN**
방법1) WHERE T1.COL = T2.COL(+)
방법2) FROM TABLE1 LEFT OUTER JOIN TABLE2 ON (T1.COL = T2.COL)

**RIGHT OUTER JOIN**
방법1) WHERE T1.COL(+) = T2.COL
방법2) FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON (T1.COL = T2.COL)

**FULL OUTER JOIN**
방법1) X (UNION 집합 연산자 활용)
방법2) FROM TABLE1 FULL OUTER JOIN TABLE2 ON (T1.COL = T2.COL)
728x90
반응형