IT 관련,,/데이터베이스(sql)

[Database/SQL]오라클 조인이란~

IT깡패's 2018. 8. 26. 15:43
728x90
반응형
SMALL


조인이란??

둘 이상의 테이블을 연결하여 데이터를 검색하는 방법

일반적으로 테이블의 식별 값인 Primary key와 테이블 간 공통 값인 Foreign Key 값을 사용하여 조인한다.


EQUI JOIN(등가조인)

조인 대상 테이블에서 공통적으로 컬럼의 값이 일치되는 행을 연결하여 결과를 생성

가장 일반적으로 사용하는 '='에 의한 조인


- emp 테이블과 dept 테이블을 조인하여 직원들의 부서명을 조회하는 예제

SQL> Select e.empno, e.ename, d.dname
From emp e, dept d
WHERE e.deptno = d.deptno
EMPNO     ENAME         DNAME
----      -----         ----------- 
7782	  CLARK	        ACCOUNTING
7839      KING	        ACCOUNTING
7934      MILLER	ACCOUNTING
7566	  JONES	        RESEARCH
7902	  FORD	        RESEARCH
7876	  ADAMS	        RESEARCH
7369      SMITH	        RESEARCH
7788	  SCOTT	        RESEARCH
7521	  WARD	        SALES
7844	  TURNER	SALES
7499	  ALLEN	        SALES
7900	  JAMES	        SALES
7698	  BLAKE	        SALES
7654	  MARTIN	SALES

NON-EQUI JOIN(비동기조인)

동일 컬럼이 없이 다른 조건을 사용하여 조인할 때 사용

BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN 을 사용

비등기조인은 자주 쓰이지 않는다.


- emp테이블의 연봉을 이용해 salgrade의 연봉등급을 조인하여 조회

SQL> SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
ENAME      SAL     GRADE
-----      ---     -----
SMITH	   800	   1
JAMES	   950	   1
ADAMS	   1100	   1
WARD	   1250	   2
MARTIN	   1250	   2
MILLER	   1300	   2
TURNER     1500	   3
ALLEN	   1600	   3
CLARK	   2450	   4
BLAKE	   2850	   4
JONES	   2975	   4
SCOTT	   3000	   4
FORD	   3000	   4
KING	   5000	   5


SELF-JOIN

하나의 테이블에서 자신의 테이블과 등가 조인이 발생하는 것이다.

하나의 테이블에 대해서 두 개의 alias를 사용해 두 개의 테이블인 것처럼 조인한다.


- emp테이블에서 사원과 해당 사원의 매니저 조회

SQL> SELECT e.ename, m.ename "Manager"
FROM emp e, emp m
WHERE e.empno = m.mgr;
ENAME      MANAGER
------     --------
JONES	   FORD
JONES	   SCOTT
BLAKE	   TURNER
BLAKE	   ALLEN
BLAKE	   WARD
BLAKE	   JAMES
BLAKE	   MARTIN
CLARK	   MILLER
SCOTT	   ADAMS
KING	   BLAKE
KING	   JONES
KING  	   CLARK
FORD	   SMITH


OUTER JOIN

등가조인의 경우 한쪽 컬럼에 값이 없다면 해당 행은 조회되지 않는다.

조인 조건을 만족하지 못 하는 행들을 같이 조회하기 위해 OUTER JOIN을 사용한다.

OUTER JOIN의 연산자는 "(+)" 조인조건을 만족하는 값이 없어도 조회하려는 쪽에 "(+)"를 사용(+)연산자는 한쪽에만 붙여서 사용 가능하다.


- emp테이블에 없는 deptno인 40에 대해서도 조인이 이루어진 것을 볼 수 있다.

- (+)연산자를 왼쪽에 두는 조건은 RIGHT OUTER JOIN으로 표현 가능

SQL> SELECT e.ename, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno(+) = d.deptno
ORDER BY e.deptno;
CLARK	10	 10        ACCOUNTING
MILLER	10	 10        ACCOUNTING
KING  	10	 10        ACCOUNTING
SMITH	20	 20        RESEARCH
ADAMS	20	 20        RESEARCH
FORD	20	 20        RESEARCH
JONES	20	 20        RESEARCH
SCOTT	20	 20        RESEARCH
WARD	30	 30        SALES
TURNER	30	 30        SALES
ALLEN	30	 30        SALES
JAMES	30	 30        SALES
BLAKE	30	 30        SALES
MARTIN	30	 30        SALES
		 40        OPERATIONS


ANSI/ISO SQL 표준 OUTER JOIN

- 오라클9i 부터 ANSO/ISO SQL 표준 문법인 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTTER JOIN문법을 지원한다.

(+)이용한 방법은 WHERE절을 이용해 조인 조건을 설정하지만 OUTER JOIN절을 이용한 조인에서는 ON절을 이용


LEFT OUTER JOIN

JOIN의 왼쪽에 오는 테이블을 모두 포함하여 조회

오른쪽에 오는 테이블에 NULL이 있어도 왼쪽 테이블의 모든 행이 출력된다.


- 매니저가 없는 직원을 포함하여 직원과 매니저 조회

SQL> SELECT employee.ename employee, manager.ename manager
FROM emp employee LEFT OUTER JOIN emp manager
ON employee.mgr = manager.empno;
EMPLOYEE   MANAGER
---------   --------
FORD	   JONES
SCOTT	   JONES
JAMES	   BLAKE
TURNER	   BLAKE
MARTIN	   BLAKE
WARD	   BLAKE
ALLEN	   BLAKE
MILLER	   CLARK
ADAMS	   SCOTT
CLARK	   KING
BLAKE	   KING
JONES	   KING
SMITH	   FORD
KING	


RIGHT OUTER JOIN

JOIN의 오른쪽에 오는 테이블을 모두 포함하여 조회

왼쪽에 오는 테이블에 NULL이 있어도 오른쪽 테이블의 모든 행이 출력된다.


- OPERATION부서에 해당하는 직원을 포함하여 조회

SQL> SELECT e.ename, e.deptno, d.deptno, d.dname
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno = d.deptno
ORDER BY e.deptno;
ENAME      DEPNO  DEPTNO_1           DNAME
CLARK	   10      10	             ACCOUNTING
MILLER     10	   10	             ACCOUNTING
KING	   10      10	             ACCOUNTING
SMITH	   20	   20	             RESEARCH
ADAMS	   20	   20	             RESEARCH
FORD	   20	   20                RESEARCH
JONES	   20	   20	             RESEARCH
SCOTT	   20	   20	             RESEARCH
WARD	   30	   30	             SALES
TURNER	   30	   30	             SALES
ALLEN	   30	   30	             SALES
JAMES	   30	   30                SALES
BLAKE	   30	   30	             SALES
MARTIN	   30	   30                SALES
		   40                OPERATIONS


FULL OUTER JOIN

양쪽 테이블 모두 OUTER JOIN 대상에 포함한다.

어느 쪽이든 NULL을 포함하는 행이 있더라도 모두 출력한다.


- test1, test2 테이블의 no 컬럼의 각각 (10, 20, 40) 데이터를 가지고 있다.

SQL> SELECT test.NO, test123.NO
FROM test FULL OUTER JOIN test123
ON test.NO = test123.NO;
NO        NO
---       ---
10        10
20        20
          40
30


CROSS JOIN

두 테이블의 카테시안 곱을 얻을 때 사용함


카네시안 곱(Cartesian Product)

- 두 개 이상의 테이블이 조인될 때 조건이 적절하지 않아 모든 데이터가 결과로 나오는 경우

- 만약 SELECT * FROM emp, dept;을 수행하면 컬럼 11개(emp컬럼 8개 + dept컬럼 3개)와 48개행(emp행 12개 * dept행 4개)의 의미없는 데이터가

조회된다.

- 카네시안 곱이 발생하는 상황을 피하려면 조인의 WHERE절에 공통되는 조건이 존재하도록 올바튼 조건을 주어야 한다.


- 다음 쿼리는 모든 컬럼과 모든 행을 조합한 카테시안 곱의 결과를 볼 수 있음

SQL> SELECT * FROM emp CROSS JOIN dept;


INNER JOIN

일반적인 JOIN에서 ,(콤마)를 생략하고 INNER JOIN 절을 사용

WHERE절 대신에 ON절을 사용한다.

INNER 키워드는 생략 가능


- emp 테이블과 dept 테이블을 조인하여 직원들의 부서명을 조회하는 예제

SQL> SELECT e.empno, e.ename, d.dname
FROM emp e INNER JOIN dept d
ON e.deptno = d.deptno;
EMPNO         ENAME        DNAME
------         ------        ------
7399             SMITH         RESEARCH
7499             ALLEN         SALES
7521             WARD         SALES
7566             JOINS          RESEARCH
7654             MARTIN        SALES
7698             BLAKE         SALES
7782             CLARK         ACCOUNTING
7839             KING            ACCOUNTING
7844             TURNER       SALES
7900             JAMES         SALES
7902             FORD           RESEARCH
7934             MILLER         ACCOUNTING


NATURAL JOIN

등가 조인과 비슷하지만 WHERE 조건절 없어 조인한다.

두 테이블의 동일한 이름의 컬럼을 모두 조인한다.

조인 조건의 제어가 어려운 단점이 있다.


- emp 테이블과 dept 테이블을 조인하여 직원들의 부서명을 조회하는 예제

SQL> SELECT empno, ename, dname
FROM emp NATURAL JOIN dept;
EMPNO          ENAME      DNAME
------          ------      ------
7399            SMITH        RESEARCH
7499            ALLEN        SALES
7521            WARD        SALES
7566            JOINS         RESEARCH
7654            MARTIN       SALES
7698            BLAKE        SALES
7782            CLARK        ACCOUNTING
7839            KING           ACCOUNTING
7844            TURNER      SALES
7900            JAMES        SALES
7902            FORD          RESEARCH
7934            MILLER       ACCOUNTING


오라클 조인에서는 등가조인, 비동기조인 외 INNER JOIN까지 기본적으로 알아야 하고 그 밖인 NATURAL JOIN도 잘 알아야 한다.

오라클 부분에서 조인을 다 알았다면 왼만한 sql문은 다 파악할 수 있다.

테스트나 면접에서도 많이 묻는 것 중에 하나이기 때문에 잘 알아두도록 하자~

728x90
반응형
LIST