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
'학습 과정 공유 및 후기 > SQLD' 카테고리의 다른 글
[ SQLD ] Oracle SQL (10) - View (0) | 2020.05.28 |
---|---|
[ SQLD ] 데이터 모델링의 이해 (2) - 데이터 모델의 성능 (0) | 2020.05.28 |
[ SQLD ] Oracle SQL (7) - 다중행(Multiple-Row) 서브쿼리 (0) | 2020.05.22 |
[ SQLD ] Oracle SQL (6) - 서브쿼리 (0) | 2020.05.21 |
[ SQLD ] Oracle SQL (5) - 형변환 함수 (0) | 2020.05.20 |