본문 바로가기
학습 과정 공유 및 후기/SQLD

[ SQLD ] Oracle SQL (9) - JOIN (INNER, OUTER)

by 커피마시는어린왕자 2020. 5. 28.

1. JOIN 개념 및 종류

이번 포스팅에서는 조인의 개념에 대해서 알아보고 아래의 4가지 개념에 대해서 알아보겠습니다.

 

  • Inner JOIN
  • Outer JOIN
  • Cross JOIN
  • Self JOIN

데이터베이스에서 'JOIN'이라는 개념은 무엇일까요?

조인은 '합치다'는 의미로, 데이터베이스에서 다양한 테이블들을 하나의 테이블로 합치는 아주 좋은 기능입니다. 

즉, 2개 이상의 테이블에 대해서 결합하여 나타낼 때 조인이라는 것을 이용합니다.

물론 셀프조인에서는 사실 하나의 테이블을 다루는 것입니다. 이에 대해서는 뒤에서 다시 이야기해보겠습니다.

 

 

예시 데이터를 보면서 알아보겠습니다.

먼저 SQLPLUS에 기본적으로 저장되어 있는 EMP 테이블을 알아보겠습니다.

 

DESC (DESCRIBE) 명령어로 EMP 테이블에 어떤 칼럼들이 있는지 살펴보겠습니다.

DESCRIBE EMP;  # EMP 테이블의 칼럼들을 알아보자. DESC 명령어는 테이블의 칼럼들을 나열해주는 기능으로, DESCRIBE 명령어와 동일합니다

< 결과 >

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

 

이어서 DEPT 테이블도 어떻게 구성되어 있는지 보겠습니다.

SQL> DESCRIBE DEPT;

< 결과 >

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)

 

두 테이블의 공통적으로 있는 칼럼은 DEPTNO라는 것을 확인할 수 있습니다.

그렇다면 EMP 테이블과 DEPT 테이블을 따로 출력해서 보지 않고, 

DEPTNO를 기준으로 두 테이블을 하나의 테이블로 합쳐서 보고 싶다면? 더욱 편리해질 것입니다.

이 때 사용되는 SQL 기능이 바로 JOIN입니다.

 

 

2. INNER JOIN

INNER JOIN은 위와 같이 우리가 조인하고자 하는 두 개의 테이블에서 공통적인 칼럼들을 결합하는 조인방식입니다. 즉 우리가 위에서 하고자 했던, 직원들의 이름과 부서명을 같이 출력하는데 있어서 사용되는 가장 일반적인 조인이죠. SQL에서도 단순히 조인을 사용할때는 암묵적으로 INNER JOIN을 뜻하게 됩니다.

 

 

JOIN에는 일반적으로 크게 2가지 종류가 있습니다.

1. SELECT FROM을 이용한 조인

SQL> SELECT EMP.ENAME, EMP.EMPNO, DEPT.LOC # STEP 2. EMP 테이블의 ENAME과 EMPNO 칼럼, 그리고 DEPT 테이블의 LOC 칼럼을 가져오겠다.
  2  FROM EMP, DEPT   # STEP 1. EMP, DEPT 테이블에서 
  3  WHERE EMP.DEPTNO = DEPT.DEPTNO;   # EMP 테이블과 DEPT 테이블의 DEPTNO가 같은 것을 기준으로.

< 결과 >

ENAME                     EMPNO LOC
-------------------- ---------- --------------------------
SMITH                      7369 DALLAS
ALLEN                      7499 CHICAGO
WARD                       7521 CHICAGO
JONES                      7566 DALLAS
MARTIN                     7654 CHICAGO
BLAKE                      7698 CHICAGO
CLARK                      7782 NEW YORK
KING                       7839 NEW YORK
TURNER                     7844 CHICAGO
JAMES                      7900 CHICAGO
FORD                       7902 DALLAS
MILLER                     7934 NEW YORK
                              1 NEW YORK

 

2. ANSI 표준 조인 (JOIN절을 이용한 명시적 조인)

ANSI SQL 표준은 값이 더 있는 쪽을 지목해줘야 합니다.

LEFT OUTER JOIN (왼쪽 값이 더 있다.)

RIGHT OUTER JOIN (오른쪽 값이 더 있다.)

FULL OUTER JOIN (양쪽 다 각기 다른 값이 존재한다.)

 

SELECT emp.deptno , dept.deptno AS 팀번호
    FROM emp RIGHT OUTER JOIN dept
    ON emp.deptno = dept.deptno;
 

SELECT DISTINCT (emp.deptno), dept.deptno AS 팀번호
    FROM dept LEFT OUTER JOIN emp
    ON emp.deptno = dept.deptno;
 

SELECT DISTINCT (emp.deptno), dept.deptno AS 팀번호
    FROM dept FULL OUTER JOIN emp
    ON emp.deptno = dept.deptno

 

예시) EMP 테이블과 DEPT 테이블의 조인

 => DEPTNO가 공통 컬럼

 => EMP 테이블의 EMP DEPT테이블의 DEPTNO를 연결하여 준다.

SELECT table1.col1, table1.col2, ..., table2.col1, table2.col2, ...

FROM table1 [table1의 별칭]

JOIN table2 [table2의 별칭] ON table1.col1 = table2.col2

 

SQL> SELECT EMP.ENAME, EMP.EMPNO, EMP.DEPTNO # STEP 2. ENAME(사원이름), EMPNO(사원번호), DEPTNO(부서번호) 정보를 뽑겠다.
  2  FROM EMP # STEP 1. EMP 테이블에서
  3  JOIN DEPT ON EMP.DEPTNO = DEPT.DEPTNO;  # STEP 3. DEPT 테이블의 DEPTNO와 EMP 테이블의 DEPTNO가 같은 걸 기준으로. 

ENAME                     EMPNO     DEPTNO
-------------------- ---------- ----------
SMITH                      7369         20
ALLEN                      7499         30
WARD                       7521         30
JONES                      7566         20
MARTIN                     7654         30
BLAKE                      7698         30
CLARK                      7782         10
KING                       7839         10
TURNER                     7844         30
JAMES                      7900         30
FORD                       7902         20
MILLER                     7934         10
                              1         10

13 rows selected.

 

앞서 살펴본 두 코드처럼 방식은 다르지만 결과는 동일합니다.

이처럼 INNER JOIN을을 통해서 직원의 이름, 직원번호, 그리고 부서 번호를 함께 출력하였습니다.

EMP 테이블의 DEPTNO와 DEPT 테이블의 DEPTNO이 같은 것끼리 결합하여 데이터를 출력한 것이죠.

 

 

3. OUTER JOIN

 

 

OUTER JOIN은 공통적인 내용만 합치는 INNER JOIN과 달리,
JOIN 조건에 해당하지 않는 컬럼값들도 결과값에 포함시키기 위한 기능입니다.

 

OUTER JOIN의 3가지 종류에 대해서 알아보겠습니다.

 

    1.  LEFT OUTER JOIN

 

    2.  RIGHT OUTER JOIN

 

    3.  FULL OUTER JOIN

 

 

1) LEFT OUTER JOIN

#LEFT OUTER JOIN 기본 형식
FROM A 
LEFT OUTER JOIN B 
즉, A LEFT OUTER JOIN B 할 경우 A 테이블(왼쪽 테이블)이 무조건 결과로 나오는 것입니다.
A,B 테이블간 조인 조건이 맞지 않는 A와 B 테이블의 레코드 중 A테이블 레코드는 무조건 결과값에 포함되어 나오는 것입니다. 
SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME, D.LOC
  2  FROM EMP E LEFT OUTER JOIN DEPT D
  3  ON E.DEPTNO = D.DEPTNO;

< 결과 >

ENAME                    DEPTNO DNAME                       LOC
-------------------- ---------- --------------------------- --------------------------
                             10 ACCOUNTING                  NEW YORK

MILLER                       10 ACCOUNTING                  NEW YORK

KING                         10 ACCOUNTING                  NEW YORK

CLARK                        10 ACCOUNTING                  NEW YORK

FORD                         20 RESEARCH                    DALLAS

JONES                        20 RESEARCH                    DALLAS

SMITH                        20 RESEARCH                    DALLAS

JAMES                        30 SALES                       CHICAGO

TURNER                       30 SALES                       CHICAGO

BLAKE                        30 SALES                       CHICAGO

MARTIN                       30 SALES                       CHICAGO

WARD                         30 SALES                       CHICAGO

ALLEN                        30 SALES                       CHICAGO


13 rows selected.

위 결과를 통해서,

EMP 테이블을 중심으로 DEPT 테이블을 합쳤기 때문에 EMP 칼럼값들이 모두 출력된 것을 볼 수 있습니다.

만약 INNER JOIN을 사용했다면 이러한 NULL 값들이 있는 행들은 제거되고 출력되지 않았을 텐데 말이죠.

그렇다면 이제는 RIGHT OUTER JOIN을 알아볼까요?

 

2) RIGHT OUTER JOIN

#RIGHT OUTER JOIN 기본 형식
FROM A 
RIGHT OUTER JOIN B
A RIGHT OUTER JOIN B 할 경우 B 테이블(오른쪽 테이블) 무조건 나오는 것입니다.
A,B 테이블간 조인 조건이 맞지 않는 A와B 테이블의 레코드 중 B테이블 레코드는 무조건 결과값에 포함되어 나오는 것입니다. 
SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME, D.LOC
  2  FROM EMP E
  3  RIGHT OUTER JOIN DEPT D
  4  ON E.DEPTNO = D.DEPTNO;

< 결과 >

ENAME                    DEPTNO DNAME						  LOC
-------------------- ---------- ----------------------------  --------------------------
SMITH                        20 RESEARCH                      DALLAS

ALLEN                        30 SALES                         CHICAGO

WARD                         30 SALES                         CHICAGO

JONES                        20 RESEARCH                      DALLAS

MARTIN                       30 SALES                         CHICAGO

BLAKE                        30 SALES                         CHICAGO

CLARK                        10 ACCOUNTING                    NEW YORK

KING                         10 ACCOUNTING                    NEW YORK

TURNER                       30 SALES                         CHICAGO

JAMES                        30 SALES                         CHICAGO

FORD                         20 RESEARCH                      DALLAS

MILLER                       10 ACCOUNTING                    NEW YORK

                             10 ACCOUNTING                    NEW YORK

                             40 OPERATIONS                    BOSTON


14 rows selected.

 

3) FULL OUTER JOIN

FULL OUTER JOIN은 '합집합'의 개념으로,

양쪽 테이블의 모든 칼럼들을 합치되, 중복되는 데이터를 제거하는 방식입니다~!

특히 FULL OUTER JOIN과 관련해서는 아래의 링크가 정말 잘 설명을 해놓으셨는데, 참고하시면 도움이 될 것 같네요 :)

 

https://thebook.io/006696/part01/ch06/03/04/

 

오라클 SQL과 PL/SQL을 다루는 기술: FULL OUTER 조인

 

thebook.io

 

 

다음 포스트에서는 CROSS JOIN과 SELF JOIN에 대해서 알아보겠습니다 :)

  • Cross JOIN
  • Self JOIN