나를 기록하다
article thumbnail
Published 2023. 8. 21. 21:56
[SQL] 조인(Join) Database/Oracle
반응형

집합 연산자와 조인의 차이점

  • 집합 연산자: 두 개 이상의 SELECT문의 결과 값을 세로로 연결
  • 조인(join): 두 개 이상의 테이블 데이터를 가로로 연결

 

조인의 종류

1. NATURAL JOIN

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

기준이 되는 열은(여기선 DEPTNO) SELECT절에 명시할 때 테이블 이름을 붙이면 안되는 특성

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
ORDER BY DEPTNO, E.EMPNO;
     EMPNO ENAME      JOB	       MGR HIREDATE	     SAL       COMM	DEPTNO DNAME	      LOC
---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- -------------- -------------
      7782 CLARK      MANAGER	      7839 1981/06/09	    2450		    10 ACCOUNTING     NEW YORK
      7839 KING       PRESIDENT 	   1981/11/17	    5000		    10 ACCOUNTING     NEW YORK
      7934 MILLER     CLERK	      7782 1982/01/23	    1300		    10 ACCOUNTING     NEW YORK
      7369 SMITH      CLERK	      7902 1980/12/17	     800		    20 RESEARCH       DALLAS
      7566 JONES      MANAGER	      7839 1981/04/02	    2975		    20 RESEARCH       DALLAS
      7788 SCOTT      ANALYST	      7566 1982/12/09	    3000		    20 RESEARCH       DALLAS
      7876 ADAMS      CLERK	      7788 1983/01/12	    1100		    20 RESEARCH       DALLAS
      7902 FORD       ANALYST	      7566 1981/12/03	    3000		    20 RESEARCH       DALLAS
      7499 ALLEN      SALESMAN	      7698 1981/02/20	    1600	300	    30 SALES	      CHICAGO
      7521 WARD       SALESMAN	      7698 1981/02/22	    1250	500	    30 SALES	      CHICAGO
      7654 MARTIN     SALESMAN	      7698 1981/09/28	    1250       1400	    30 SALES	      CHICAGO
      7698 BLAKE      MANAGER	      7839 1981/05/01	    2850		    30 SALES	      CHICAGO
      7844 TURNER     SALESMAN	      7698 1981/09/08	    1500		    30 SALES	      CHICAGO
      7900 JAMES      CLERK	      7698 1981/12/03	     950		    30 SALES	      CHICAGO

 

2. JOIN ~ USING

NATURAL JOIN이 자동으로 조인 기준 열을 지정하는 것과 달리 USING 키워드에 조인 기준으로 사용할 열을 명시

기준이 되는 열은(여기선 DEPTNO) SELECT절에 명시할 때 테이블 이름을 붙이면 안되는 특성

FROM TABLE1 JOIN TABLE2 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)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
     EMPNO ENAME      JOB	       MGR HIREDATE	     SAL       COMM	DEPTNO DNAME	      LOC
---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- -------------- -------------
      7839 KING       PRESIDENT 	   1981/11/17	    5000		    10 ACCOUNTING     NEW YORK
      7788 SCOTT      ANALYST	      7566 1982/12/09	    3000		    20 RESEARCH       DALLAS
      7902 FORD       ANALYST	      7566 1981/12/03	    3000		    20 RESEARCH       DALLAS

 

3. JOIN ~ ON

가장 범용성 있는 조인 방식.

기존 WHERE절에 있는 조인 조건식을 ON 키워드 옆에 작성.

조인 기준 조건식은 ON에 명시하고 그 밖의 출력 행을 걸러 내기 위해 WHERE 조건식을 따로 사용하는 방식

FROM TABLE1 JOIN TABLE2 ON (조인 조건식)
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)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
     EMPNO ENAME      JOB	       MGR HIREDATE	     SAL       COMM	DEPTNO DNAME	      LOC
---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- -------------- -------------
      7839 KING       PRESIDENT 	   1981/11/17	    5000		    10 ACCOUNTING     NEW YORK
      7788 SCOTT      ANALYST	      7566 1982/12/09	    3000		    20 RESEARCH       DALLAS
      7902 FORD       ANALYST	      7566 1981/12/03	    3000		    20 RESEARCH       DALLAS

 

4. OUTER JOIN

외부 조인에 사용.

다른 SQL-99 방식의 조인과 마찬가지로 WHERE절이 아닌 FROM절에서 외부 조인을 선언.

왼쪽 외부 조인
(Left Outer Join)
기존 WHERE TABLE1.COL1 = TABLE2.COL1(+)
SQL-99 FROM TABLE1 LEFT OUTER JOIN TABLE2 ON (조인 조건식)
오른쪽 외부 조인
(Right Outer Join)
기존 WHERE TABLE1.COL1(+) = TABLE2.COL1
SQL-99 FROM TABLE1 RIGHT OUTER JOIN TABLE2 ON (조인 조건식)
전체 외부 조인
(Full Outer Join)
기존 기본 문법 없음(UNION 집합 연산자를 활용)
SQL-99 FROM TABLE1 FULL OUTER JOIN TABLE2 ON (조인 조건식)

왼쪽 외부 조인 SQL-99

SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
     EMPNO ENAME	     MGR  MGR_EMPNO MGR_ENAME
---------- ---------- ---------- ---------- ----------
      7369 SMITH	    7902       7902 FORD
      7499 ALLEN	    7698       7698 BLAKE
      7521 WARD 	    7698       7698 BLAKE
      7566 JONES	    7839       7839 KING
      7654 MARTIN	    7698       7698 BLAKE
      7698 BLAKE	    7839       7839 KING
      7782 CLARK	    7839       7839 KING
      7788 SCOTT	    7566       7566 JONES
      7839 KING
      7844 TURNER	    7698       7698 BLAKE
      7876 ADAMS	    7788       7788 SCOTT
      7900 JAMES	    7698       7698 BLAKE
      7902 FORD 	    7566       7566 JONES
      7934 MILLER	    7782       7782 CLARK

오른쪽 외부 조인 SQL-99

SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
     EMPNO ENAME	     MGR  MGR_EMPNO MGR_ENAME
---------- ---------- ---------- ---------- ----------
      7369 SMITH	    7902       7902 FORD
      7499 ALLEN	    7698       7698 BLAKE
      7521 WARD 	    7698       7698 BLAKE
      7566 JONES	    7839       7839 KING
      7654 MARTIN	    7698       7698 BLAKE
      7698 BLAKE	    7839       7839 KING
      7782 CLARK	    7839       7839 KING
      7788 SCOTT	    7566       7566 JONES
      7844 TURNER	    7698       7698 BLAKE
      7876 ADAMS	    7788       7788 SCOTT
      7900 JAMES	    7698       7698 BLAKE
      7902 FORD 	    7566       7566 JONES
      7934 MILLER	    7782       7782 CLARK
				       7654 MARTIN
				       7521 WARD
				       7844 TURNER
				       7934 MILLER
				       7369 SMITH
				       7876 ADAMS
				       7900 JAMES
				       7499 ALLEN

전체 외부 조인 SQL-99

SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 FULL OUTER JOIN EMP E2 ON (E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
     EMPNO ENAME	     MGR  MGR_EMPNO MGR_ENAME
---------- ---------- ---------- ---------- ----------
      7369 SMITH	    7902       7902 FORD
      7499 ALLEN	    7698       7698 BLAKE
      7521 WARD 	    7698       7698 BLAKE
      7566 JONES	    7839       7839 KING
      7654 MARTIN	    7698       7698 BLAKE
      7698 BLAKE	    7839       7839 KING
      7782 CLARK	    7839       7839 KING
      7788 SCOTT	    7566       7566 JONES
      7839 KING
      7844 TURNER	    7698       7698 BLAKE
      7876 ADAMS	    7788       7788 SCOTT
      7900 JAMES	    7698       7698 BLAKE
      7902 FORD 	    7566       7566 JONES
      7934 MILLER	    7782       7782 CLARK
				       7934 MILLER
				       7900 JAMES
				       7876 ADAMS
				       7844 TURNER
				       7654 MARTIN
				       7521 WARD
				       7369 SMITH
				       7499 ALLEN

 

5. SQL-99 조인 방식에서 세 개 이상의 테이블을 조인할 때

기존 조인 방식은 FROM절에 조인 테이블을 명시하고 조인 관련 조건식을 WHERE절에 명시

→ 테이블 수가 두 개를 넘더라도 아래와 같이 작성하면 문제가 없음

FROM TABLE1, TABLE2, TABLE3
WHERE TABLE1.COL = TABLE2.COL
AND TABLE2.COL = TABLE3.COL

FROM절에 조인 관련 내요을 작성해야 하는 SQL-99 방식에서는 테이블의 개수가 두 개를 넘어갈 때 다음과 같이 FROM절에 두 개 테이블을 키워드로 조인한 바로 옆에 SQL-99 방식의 조인 내요을 추가로 작성하면 세 개 이상을 테이블도 조인 가능!

FROM TABLE1 JOIN TABLE2 ON (조건식)
JOIN TABLE3 ON (조건식)

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...