본문으로 바로가기

[Oracle] Join에 대하여

category Oracle/Oracle SQL 2017. 10. 20. 13:14

Oracle에서 조인(JOIN)이란..


'두 개 이상의 테이블이나 데이터 베이스를 서로 연결하여 데이터를 검색할 때 사용하는 방법으로 서로 연관있는 테이블을 이용하여 두 개의 테이블이 마치 하나의 테이블인 것처럼 보여주는 것'

일반적으로 PRIMARY KEY(PK) FOREIGN KEY (FK)를 사용하여 JOIN 하는 경우가 대부분이지만 논리적인 값들의 연관으로 JOIN하는 경우도 있다.


조인(JOIN) 구문 형태


SELECT table1.colum1[, table2.column2 ...]
FROM  table1, table2
WHERE table1.colum1=table2.column2;

또는 join절을 이용한 명시적 조인

SELECT table1.colum1[,table2.colum2...]
FROM table1 JOIN table2
ON  table1.column1 = talbe2.column2;


조인의 형태


  1) EQUI JOIN  : 조인조건이 정확히 일치하는 경우에 사용(pk와 fk를 사용하여)
  2) NON-EQUI JOIN : 조인 조건이 정확히 일치하지 않는 경우에 사용(등급,학점)
  3) OUTER JOIN  : 조인 조건이 정확히 일치하지 않는 경우에도 모든 행들을 출력
  4) SELF JOIN  : 하나의 테이블에서 행들을 조인하고자 할 때 사용

그 외
  5) Cartesian Product : 모든 가능한 행들의 조인
  6) Set Operator     : 여러 개의 select문장을 연결하여 작성한다.


#EQUI JOIN


조인 조건이 EQUAL(=) 기호로 만들어지는 경우

- dept와 emp의 equi join

SELECT D.DNAME, D.DEPTNO, E.ENAME, E.JOB
FROM DEPT D, EMP E
WHERE D.DEPTNO=E.DEPTNO
ORDER BY D.DEPTNO ASC;

명시적 JOIN절 사용 (위와 동일한 결과)

SELECT DNAME, D.DEPTNO, ENAME, LOC
FROM DEPT D JOIN EMP E
ON D.DEPTNO=E.DEPTNO
ORDER BY 1;


[결과]




#NON-EQUI JOIN


조인 조건이 EQUAL(=)이 아닌 다른 연산 기호로 만들어지는 경우

각 사원의 사원명, 급여, 급여 등급을 출력 하라.

SELECT ENAME, SAL, GRADE, LOSAL, HISAL
FROM EMP E JOIN SALGRADE S
ON E.SAL BETWEEN S.LOSAL AND S.HISAL;


[결과]


#OUTER JOIN


INNER JOIN이 JOIN 조건에 부합하는 행만 JOIN이 발생하는 것이라면, 
OUTER JOIN 조건에 부합하지 않는 행까지도 포함시켜 결합하는 것을 의미한다.

자주는 아니지만, 가끔 유용하게 사용될 수 있으므로 꼭 알아둘 필요는 있다.

기본 구문은 아래와 같다.

  1. SELECT <열 목록>
  2. FROM <첫번째 테이블 (LEFT 테이블)>
  3.     <LEFT | RIGHT | FULL> OUTER JOIN <두번째 테이블 (RIGHT 테이블)>
  4.                           ON <조인될 조건>
  5. [WHERE 검색 조건]

INNER JOIN과 유사해 보이지만, LEFT, RIGHT, FULL의 새로운 키워드들이 보인다.


2. LEFT OUTER JOIN

LEFT OUTER JOIN 왼쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미이다.

즉, FROM 첫번째 테이블 LEFT OUTER JOIN 두번째 테이블이라면, 첫번째 테이블의 것은 모두 출력되어야 한다.
예제를 살펴 보자.

  1. -- 전체 회원의 구매기록을 살펴보자.
  2. -- 단, 구매 기록이 없는 회원도 출력되어야 한다.
  3.  
  4. -- LEFT OUTER JOIN이므로, UserTable은 모두 출력된다
  5.  
  6. SELECT U.ID, Name, GoodName, Addr
  7. FROM UserTable U                    -- LEFT Table    
  8.         LEFT OUTER JOIN BuyTable B  -- RIGHT Table
  9.         ON U.ID = B.ID
  10. ORDER BY U.ID

INNER JOIN시 INNER 키워드를 생략 가능했던 것처럼,
LEFT OUTER JOIN 역시 LEFT JOIN만으로 작성해도 무방하다.

위 예제의 결과는 아래와 같다. (모든 UserTable의 행이 출력되었다)



3. RIGHT OUTER JOIN

RIGHT OUTER JOIN 오른쪽 테이블의 것은 조건에 부합하지 않더라도 모두 결합되어야 한다는 의미이다.

즉, FROM 첫번째 테이블 RIGHT OUTER JOIN 두번째 테이블이라면, 두번째 테이블의 것은 모두 출력되어야 한다.
LEFT OUTER JOIN의 예제와 동일한 결과를 얻을 수 있도록 예제를 작성해 보자.

  1. -- 전체 회원의 구매기록을 살펴보자.
  2. -- 단, 구매 기록이 없는 회원도 출력되어야 한다.
  3.  
  4. -- RIGHT OUTER JOIN이므로, UserTable은 모두 출력된다
  5.  
  6. SELECT U.ID, Name, GoodName, Addr
  7. FROM BuyTable B                       -- LEFT Table    
  8.         RIGHT OUTER JOIN UserTable U  -- RIGHT Table
  9.         ON B.ID = U.ID
  10. ORDER BY U.ID

역시 RIGHT OUTER JOIN은 RIGHT JOIN만으로도 작성이 가능하다.


4. FULL OUTER JOIN

전체 조인 또는 전체 외부 조인이라고 한다.
FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 것이라고 생각하면 된다.

즉, 한쪽을 기준으로 조건과 일치하지 않는 것을 출력하는 것이 아니라,
양쪽 모두에 조건이 일치하지 않는 것들까지 모두 결합하는 개념이다.

따라서, 테이블들의 모든 행이 조건에 관계없이 결합된다.


#SELF JOIN

  • - Equi Join과 같으나 하나의 테이블에서 조인이 일어나는 것이 다르다.
  • - 같은 테이블에 대해 두 개의 alias를 사용하여 FROM절에 두 개의 테이블을 사용하는 것 처럼 조인한다.

1
2
3
4
5
6
7
8
9
10
11
12
-- 사원의 매니저명을 조회하는 Self Join 예제
SELECT e.ename, a.ename "Manager"
  FROM emp e, emp a
 WHERE e.empno = a.mgr;
 
ENAME     Manager
------- ----------
FORD      SMITH
BLAKE     ALLEN
BLAKE     WARD
KING      JONES
...



# 궁금한점은 댓글 남겨주시면 부족한 지식이지만 답변 드리겠습니다.



참고 자료 :

1. 실무에서도 중요한 오라클 조인(Join) 개념과 예제 - http://bisuanytime.blogspot.kr/2016/10/join.html

2. 꿈꾸는 개발자, DBA 커뮤니티 구루비 - http://www.gurubee.net/lecture/1020

3. 수까락의 프로그래밍 이야기 - http://egloos.zum.com/sweeper/v/3002220