조인이란??
둘 이상의 테이블을 연결하여 데이터를 검색하는 방법
일반적으로 테이블의 식별 값인 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문은 다 파악할 수 있다.
테스트나 면접에서도 많이 묻는 것 중에 하나이기 때문에 잘 알아두도록 하자~
'IT 관련,, > 데이터베이스(sql)' 카테고리의 다른 글
[SQL/Oracle]ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 (0) | 2018.09.05 |
---|---|
[Database/SQL]오라클 서브 쿼리(Sub Query)란?? (0) | 2018.08.27 |
[Database/SQL]오라클 뷰와 시퀀스 사용하기~ (2) | 2018.08.23 |
[Database/SQL]오라클 인덱스란~ (0) | 2018.08.05 |
[Database]오라클 계정 생성후 락해제~ (0) | 2018.08.04 |