[ JOIN ]

☞ JOIN 기본개념 및 종류

 

- 정의 :  하나 이상의 테이블로부터 연관된 데이터를 검색해오는 방법
- Join의 종류
   1. Equijoin       : 컬럼간의 값들이 서로 정확히 일치하는 경우에 사용, 일반적으로 PK,
                       FK 관계에 의함
   2. Non-Equijoin   : 한 컬럼의 값이 다른 컬럼의 값과 정확히 일치하지 않는 경우에 사용
   3. Outer Join     : Join 조건을 만족하지 않는 경우에도 모든 행들을 다 보고자 하는  경우 사용
   4. Self Join      : 같은 테이블에 있는 행들을 Join하고자 하는 경우에 사용
   5. Cartesian Join : Join에 대한 조건이 생략되거나 잘못 기술되면 한 테이블에 있는 모든
                       행들이 다른 테이블에 있는 모든 행들과 Join이 되어 얻어진 결과
   6. ANSI Join
     ㅇ Natural Join : 두 테이블에 공통 칼럼이 있는 경우 별다른 조인 조건 없이 공통 칼럼에
                       대해 묵시적으로 조인이 되는 유형
     ㅇ JOIN ~ USING : 조인하고자 하는 테이블에 같은 이름의 칼럼이 많은데, 이 중 특정한
                       칼럼으로만 조인하고 싶다면 조인하고자 하는 칼럼명에 USING 절을 사용
   7. CROSS JOIN    : CROSS 죠인은 두 테이블의 곱집합을 생성한다.
                      이는 두 테이블 간의 Cartesian 곱과 같다. 
   8. FULL OUTER 조인
   9. INNER JOIN    : SQL: 1999 표준에 의하면 두 테이블을 죠인하여 오로지 대응되는 행들만을
                      반환하는 것을 INNER 죠인이라 합니다.
                      INNER 죠인의 결과와 함께 왼쪽(오른쪽) 테이블의 대응되지 않는 행들도
                      반환하는 것을 LEFT(RIGHT)OUTER 죠인이라 합니다.
                      INNER 죠인의 결과와 함께 LEFT 및  RIGHT OUTER 죠인의 결과까지 모두
                      반환하는 것을 FULL OUTER 죠인이라 합니다.
   10. NATURAL JOIN : 
         NATURAL 죠인은 두 테이블에서 같은 이름을 가진 모든 컬럼에 기반한다.
         두 테이블의 대응되는 모든 컬럼에 대해 같은 값을 가지는 행들을 선택한다.
         만일 같은 이름을 가지는 컬럼들이 서로 다른 데이터 형을 가질 때에는 오류가 반환된다.
         만일 SELECT * 문법을 사용한다면, 공통 컬럼들은 결과 집합에서 단 한번만 나타난다.
         테이블 이름이나 가명 등의 수식자들은 NATURAL 죠인에 사용된 컬럼들을 수식할 수 없다. 

☞ 


☞ ANSI Join

 

예시) SELECT d.name, r.name
      
FROM   s_dept d
      
JOIN   s_region r USING (region_id)
      
WHERE  r.name like '%서울%' ;
     ㅇ JOIN ~ ON : 공통된 이름의 칼럼이 없다거나, 일반적인 조인을 수행하는 경우 가장
                    보편적으로 사용되는 조인 유형

예시)
SELECT e.name 사원명,  d.name  부서명, r.name  지역명
      
FROM   s_emp e
      
JOIN   s_dept d   ON (e.dept_id   = d.dept_id )
      
JOIN   s_region r ON (d.region_id = r.region_id )
      
WHERE  d.name = '인사부' ;

USING절을 이용한 조인
   만일 여러 개의 컬럼이 이름은 같지만 데이터 형이 모두 일치되지는 않을 때에는, NATURAL JOIN은    USING 절을 이용하여 동등 죠인에 사용될 컬럼들을 명시하도록 수정될 수 있습니다.

   USING 절에서 참조되는 컬럼들은 SQL 문 어디에서도 수식자(테이블 이름이나 가명)에 의해
   수식될 수 없습니다.

   NATURAL 과 USING의 두 키워드는 상호 배타적으로 사용됩니다.

예시) SELECT e.employee_id, e.last_name, d.location_id
      FROM   employees e JOIN departments d  USING (department_id);

 

 

 

☞ SELF Join

 

정의  : 한 테이블의 행을 같은 테이블에 있는 행과 연결하는 방법으로 같은 테이블을 마치 두 개의
        테이블인 것처럼 사용하여 Join하는 방법
예시1) SELECT  w.id 사번, w.name 사원명, m.id 부서장사번, m.name 부서장명
          FROM s_emp w, s_emp m
          WHERE  w.manager_id = m.id ;
   예시2) SELECT  w.id 사번, w.name 사원명, m.id 부서장사번, m.name 부서장명
          FROM s_emp w JOIN s_emp m
          ON  w.manager_id = m.id  ;

☞ Non-equ Join

 

정의 : 한 칼럼의 값이 다른 칼럼의 값과 정확히 일치하지 않는 경우에 연산자 외의 다른 연산자를
       사용하여 Join하는 방법
예시1)
SELECT e.name, e.salary , g.grade 급여등급
      
FROM   s_emp e, salgrade g
      
WHERE  e.salary BETWEEN g.losal AND g.hisal ;
예시2)
SELECT
e.name, e.salary , g.grade 급여등급
      
FROM   s_emp e JOIN  salgrade g ON  e.salary BETWEEN g.losal AND g.hisal ;

☞ Outer Join

 

예시) SELECT  e.name 사원명,e.id,c.name 고객명
      
FROM    s_emp e, s_customer c
      
WHERE   e.id(+) = c.sales_rep_id OR RIGHT JOIN s_customer c ON  e.id = c.sales_rep_id
      
ORDER BY
2;

 

- UNION(합집합), UNION ALL(합집합+교집합), INTERSECT(교집합), MINUS(차집합)
※ 첫 번째 SELECT구문에서 기술된 칼럼들과 두 번째 SELECT구문에서 기술된 칼럼들은 그 개수와
   타입이 일치해야 함.
※ 칼럼의 Heading은 첫번째 SELECT구문의 칼럼명이 출력됨
※ ORDER BY절은 마지막에 한 번만 기술됨

예시) S_EMP 테이블에서 사원의 사번, 이름, 그리고 담당 부서장을 아래의 결과와 같이 출력하되,
      Outer Join을 사용하지 않고 SET연산자를 사용하여 담당부서장이 없는 사원까지 나타내시오.

SQL>
SELECT  w.id 사번, w.name 사원명 , m.name 부서장명
     
FROM    s_emp w, s_emp m
     
WHERE   w.manager_id = m.id  
     
UNION
     
SELECT  id 사번, name 사원명 , '부서장없음'
     
FROM    s_emp
     
WHERE   manager_id is null ;

Outer Join 연산의 경우)
SQL>
SELECT  w.id 사번, w.name 사원명 , m.name 부서장명
     
FROM    s_emp w LEFT JOIN s_emp m ON
m.id = w.manager_id ;

 

▣ LEFT OUTER 조인
   SELECT e.last_name, d.department_name
   
FROM   employees e LEFT OUTER JOIN departments d
          
ON
(e.department_id = d.department_id);

 

RIGHT OUTER 조인
   
SELECT e.last_name, d.department_name
   
FROM   employees e RIGHT OUTER JOIN departments d
             
ON(e.department_id = d.department_id)

 


☞ CROSS Join

 

SELECT last_name, department_name
FROM   employees CROSS JOIN
departments;

 


☞ NATURAL JOIN

 

SELECT department_id, location_id
FROM   locations NATURAL JOIN departments;

 


☞ FULL OUTER JOIN

 

 SELECT e.last_name, d.department_name
 
FROM   employees e FULL OUTER JOIN departments d ON (e.dept_id = d.dept_id);

 


☞ 추가JOIN방법  

 

▣ Exists를 이용한 조회

      FROM locations l JOIN departments d  
           ON
((l.location_id = d.location_id) AND NOT EXISTS ( SELECT 1 FROM employees e
                                                                
WHERE e.dept_id = d.dept_id
                                                              )
               );

 

 


 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - 예제_FOR_UPDATE_WAIT  (0) 2017.01.18
Oracle - 예제_CASE_예제1  (0) 2017.01.18
Oracle - 예제_LEAD.LAG  (0) 2017.01.18
Oracle - 예제_UPDATE  (0) 2017.01.18
Oracle - 예제_SUBQUERY  (0) 2017.01.18
Posted by 농부지기
,