출처 - http://egloos.zum.com/wingh/v/4082857

 

Out(외부) Join

 - equijoin 문장들의 한가지 제약점은 그것들이 조인을 생성하려 하는 두 개의 테이블의 두 개
    컬럼에서 공통된 값이 없다면 테이블로부터 테이터를 Return하지 않는 다는 것입니다.

 - 정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 outer join을 사용합니다.
    Outer join 연산자 "( + )"입니다.

 -조인시킬 값이 없는 조인측에 "( + )"를 위치 시킵니다.


 - Outer join 연산자는 표현식의 한 편에만 올 수 있습니다.


예제1) 일반 조인의 경우

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno = b.deptno

DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30


예제2)out join을 했을 경우


SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

 DEPTNO     DEPTNO
 -------     ----------
     10         10
     20         20
     30         30
                 40

※ 다음의 쿼리를 한번 잘 보시기 바랍니다.

SQL>  SELECT DISTINCT(a.deptno), b.deptno
          FROM emp a, dept b
          WHERE  a.deptno(+) = b.deptno

               ANDa.ename LIKE '%';

    DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30

쿼리 결과를 잘 보면 out조인이 되지 않은 것을 알 수 있습니다.
위 쿼리를 out조인이 되기 위해서는 아래와 같이 고쳐야 합니다
.

SQL> SELECT DISTINCT(a.deptno), b.deptno
         FROM emp a, dept b
         WHERE  a.deptno(+) = b.deptno
              AND a.ename(+) LIKE '%'

    DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30
                    40

OUT조인 조건이 걸려있는 테이블에는 다른 조건절이 들어와도
똑같이 OUT조인 연산자인 (+)를 해주어야 합니다.  



Oracle9i 부터는 ANSI/ISO SQL표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN를 지원 합니다.


LEFT OUTER JOIN
 왼쪽 테이블에 조인시킬 컬럽의 값이 없는 경우 사용합니다.
 
SQL>SELECT DISTINCT(e.deptno), d.deptno
    FROM dept d LEFT OUTER JOIN emp e
    ON d.deptno = e.deptno;
 
 
RIGHT OUTER JOIN
 - 오른쪽에 테이블에 조인시킬 컬럽의 값이 없는 경우 사용합니다.
 
SQL>SELECT DISTINCT(a.deptno), b.deptno
    FROM emp a RIGHT OUTER JOIN dept b
    ON a.deptno = b.deptno;
 
 
FULL OUTER JOIN
양쪽 테이블에 다 outer join을 거는것을 TWO-WAY OUTER JOIN 또는 FULL OUTER JOIN이라 합니다.
 
SQL>SELECT DISTINCT(a.deptno), b.deptno
    FROM emp a FULL OUTER JOIN dept b
    ON a.deptno = b.deptno;
 
-- 위 세 문장의 결과는 아래와 같습니다.
    DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30
                   40
 
LEFT OUTER JOIN과 RIGHT OUTER JOIN의 테이블 순서를 바꾸어 가면서 테스트를 하시면 쉽게 이해를 하실 수 있습니다.

출처 : 오라클 클럽

'IT > DB' 카테고리의 다른 글

[Oracle] pro*c 란 - 초보자를 위한 개념 설명  (10) 2016.05.13
[DB] order by 1의 뜻  (0) 2016.04.25
[DB] oracle NVL함수  (0) 2016.04.25
[Oracle] Grouping(), ROLLUP, CUBE Study 정리  (0) 2016.04.22
-펌-[DB]SQL / MySQL 서브쿼리(SubQuery)  (0) 2016.04.06

출처 - http://repilria.tistory.com/285


조인(Join)이란? 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법

★ 조인의 종류?
- 등가 조인 (equi join)
- 비등가 조인 (non-equi join)
- 포괄 조인 (outer join)
- 자체 조인 (self join)
- 교차 조인 (Cross Joins)
- 자연 조인 (Natural Joins)

1. 카티시안 곱 (Cartesial Product)
- 조인 조건이 부적합하거나 조인 조건을 완전히 생략한 경우 행의 모든 조합을 표시하는 카티시안 곱이 생성된다.
첫번째 테이블의 모든 행이 두번째 테이블의 모든 행에 조인된다.
카티시안 곱은 너무 많은 행을 생성하므로 결과가 유용하게 사용되지 않는다.
특별히 모든 테이블에 있는 모든 행을 조합해야 하는 경우가 아니라면 where절에 유효한 조인 조건을 포함시켜야 한다.
적정 양의 데이터를 시뮬레이션하기 위해 많은 수의 행을 생성해야 하는 경우 등 일부 테스트에서는 유용하게 사용된다.

SQL> select last_name, department_name
2 from employees, departments;


2. 등가 조인 (equi join) - 단순 조인 or 내부 조인(inner join)이라고도 함
- 주로 Primary Key와 Foreign Key를 보조 수단으로 사용하여 조인
- departments 테이블과 employees 테이블은 department_id를 공통된 컬럼으로 가지고 있다.
따라서 이 컬럼을 where절에서 조건으로 지정해 준다면 등가 조인을 할 수 있다.
- 등가 조인의 성능을 높이기 위해서는 Index 기능을 사용하는 것이 좋다.

SQL> select e.employee_id, e.last_name, d.department_id, d.location_id
2 from employees e, departments d
3 where e.department_id = d.department_id;


3. 비등가 조인 (non-equi join)
- 동등 연산자(=)가 아닌 연산자를 포함하는 조인
- between and, is null, is not null, in, not in
- ex) employees 테이블의 급여는 jobs 테이블의 min_salary와 max_salary 사이에 있어야 한다.

SQL> select e.last_name, e.salary, j.job_title
2 from employees e, jobs j
3 where e.salary between min_salary and max_salary;


4. 포괄 조인 (outer join)
- outer join은 조인 조건을 만족하지 않는 행도 반환한다.
- 연산자는 더하기 기호 (+) 이고, 조인시킬 값이 없는 조인측에 위치시킨다.
- outer join 연산자는 표현식의 where절에서 한 편에만 올 수 있고, in, or 연산자는 사용할 수 없다.
- 아래 쿼리문은 사원이 없는 부서의 테이블 이름도 반환한다.

SQL> select e.last_name, e.department_id, d.department_name
2 from employees e, departments d
3 where e.department_id(+) = d.department_id;


- 4.1 Left Outer Join : 왼쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용한다. (아래의 SQL문은 같은 의미)

SQL> select e.last_name, e.department_id, d.department_name
from employees e
left outer join departments d
on (e.department_id = d.department_id)

SQL> select e. last_name, e.department_id, d.department_name
2 from employees e, departments d
3 where d.department_id (+) = e.department_id;


 


- 4.2 Right Outer Join : 오른쪽 테이블에 조인시킬 컬럼의 값이 없는 경우 사용한다.

SQL> select e.last_name, e.department_id, d.department_name
2 from employees e
3 right outer join departments d
4 on (e.department_id = d.department_id);

SQL> select e.last_name, e.department_id, d.department_name
from employees e, departments d
where d.department_id = e.department_id (+)


 


- 4.3 Full Outer Join : 양쪽 테이블에 모두 Outer Join을 하는 것으로 Two-way Outer Join 이라고도 한다.

SQL> select e.last_name, e.department_id, d.department_name
from employees e
full outer join departments d
on (e.department_id = d.department_id)


5. 자체 조인 (self join)
- Equi Join과 동일하지만 하나의 테이블 안에서 조인이 일어난다.
- 같은 테이블을 마치 2개의 테이블을 사용하는 것처럼 조인한다.
- ex) 각 사원의 관리자 이름을 찾으려면 Employees 테이블을 자체 조인해야 한다.
즉, 각 사원의 매니저 ID와 사원 ID가 동일한 사원을 찾아야 한다.

SQL> select worker.last_name || ' works for ' || manager.last_name
2 from employees worker, employees manager
3 where worker.manager_id = manager.employee_id;


 


6. 교차 조인 (cross join)
- cross join은 두 테이블의 상호간의 조합을 생성한다.
- 두 테이블 사이의 카티시안 곱(cartesian product)의 결과와 동일하다.

SQL> select last_name, department_name
from employees
cross join departments


7. 자연 조인 (Natural Join)
- 두 테이블의 하나 이상의 공통된 컬럼(데이터 타입과 이름이 일치해야함)을 기반으로 조인연산을 수행한다.
- DEPARTMENTS 테이블과 LOCATIONS 테이블은 공통적으로 NUMBER(4) 타입의 LOCATION_ID 속성이 존재한다.
따라서 두 테이블은 LOCATION_ID 컬럼을 통해서 자연 조인이 가능하다.
- 일반적으로 등가 조인 (equi join)과 동일하다고 보면 된다.
단지 where절로 조건을 거느냐 natural join 키워드로 조인을 거느냐의 차이?
(자연 조인안에서 다시 where절로 조건을 걸수 있음)

SQL> select department_id, department_name, location_id, city
2 from departments
3 natural join locations;


- 7.1 Using절을 포함하는 조인
-- Using절을 사용하면 equi join에 사용될 열만을 지정할 수 있다.
-- Using절 안에 포함되는 컬럼에 alias를 지정하면 오류가 발생한다.

SQL> select e.employee_id, e.last_name, d.location_id
from employees e join departments d
using (department_id)


- 7.2 On 절을 이용한 조인
-- 자연 조인의 기본 조인 조건은 기본적으로 같은 이름을 가진 모든 열의 equi join 이다.
-- 임의 의 조건을 지정하거나 조인할 열을 지정하려면 on절을 사용해야 한다.

SQL> select e.last_name emp, m.last_name mgr
from employees e join employees m
on (e.manager_id = m.employee_id)


테이블 Alias를 사용하면 데이터베이스의 액세스 속도를 높이고, SQL 코드의 양이 작아지므로 메모리 사용이 줄어든다.

+ Recent posts