본문 바로가기

.주제별/SQL,DB

SQL)강의- 제 5 장 복수 테이블로부터 데이터 조회

출처 : http://naver.kaist.ac.kr/oracle_sql/s05.htm

1. Join이란?

    ◈DB상에서 한 개 이상의 테이블로부터 데이터가 요구될 시 조인 조건이 사용된다.
    ◈한 테이블의 행들은 타 테이블의 column에 존재하는 공통된 값, 일반적으로 Primary key와
       Foreign key 값을 사용하여 조인한다.

     

Join 방법

        ◈주로 사용되는 두 개의 조인 방법

             1. Equijoin     :  = 로 조인한 경우
             2. Non-equijoin :  = 을 쓰지 않고 조인한 경우

        ◈추가적인 조인 방법

             1. Outer join  : 데이터가 한 쪽 테이블에만 있을 경우에 전체를 출력한다.
             2. Self join   : 자기 자신과 조인
             3. Set operators : union 등

     

Cartesian product

    ◈Cartesian product는 다음과 같은 경우에 발생된다.
    ◈조인 조건을 생략한 경우와 조인 조건이 잘못된 경우
    ◈첫번째 테이블의 모든 행들이 두번째 테이블의 모든 행과 조인이 되는 경우
    ◈Cartesian product를 피하기 위해서는 WHERE절에 정확한 조인 조건을 쓰도록 한다.
    ◈Cartesian product란?

      ◈모든 가능한 행들의 조합이 display된다.
      ◈첫번째 테이블의 모든 행들은 두번째 테이블의 모든 행들과 조인 된다.
       

    실습 : Catesian Product가 발생된 잘못된 조인 예

    SQL> SELECT name, last_name   FROM   s_dept, s_emp;

    ※ 현재 s_dept 테이블은 12개의 행, s_emp 테이블은 25개의 행으로 구성되어 있다.(12*25 = 300)

     

2. 단순 조인 Query(Equijoin)

    두개 이상의 관련 테이블로 부터 데이터를 출력 시키기 위하여 WHERE 절에 단순한 조인 조건문을 작성한다.

♣ Syntax

    SELECT   table.column, table.column          - 데이터를 검색할 테이블 column
    FROM     table1, table2
    WHERE    table1.column1 = table2.column2;    - 조인 조건


    ◈Guidelines

      ◈같은 column명이 한개 이상의 테이블에 존재하는 경우 column명은 해당 테이블명을
         붙여 사용한다.
      ◈테이블들을 함께 조인하기 위해서는 최소한 테이블 개수 1 조건의 개수가 필요하다.
         즉 4개의 테이블을 조인하기 위해 최소 3개의 조인 조건이 필요하다.
      ◈두 테이블 상에서 각 column의 값이 일치하여야 한다.
       

    실습 : s_emp테이블과 s_dept테이블을 조인하여 출력하시오.

    SQL> SELECT  s_emp.last_name, s_emp.dept_id, s_dept.name
             FROM    s_emp, s_dept
             WHERE   s_emp.dept_id = s_dept.id;

     

테이블명 사용

    ◈두개의 테이블상에서 같은 이름이 존재하지 않는 경우는 column명을 테이블명과 같이 쓸 필요가
       없으나 테이블명을 접두사로 사용함으로써 향상된 성능을 얻을 수 있다. 
     

    실습 : 모든 부서에 대해 부서번호, 지역번호 및 지역명을 출력하시오.

    SQL> SELECT s_dept.id, s_region.id, s_region.name
            FROM   s_dept, s_region
            WHERE  s_dept.region_id = s_region.id;

     

추가적인 검색 조건

    ◈조인 이외에 WHERE절에 추가적인 조건을 가질 수 있는데, AND연산자 등을 이용한다.
    ◈테이블 Alias는 SQL코드를 더 적게하므오 더 적은 메모리를 사용하게 해준다.

    실습 : Menchu라는 사원의 성, 부서번호 및 부서이름을 출력하시오.

    SQL> SELECT s_emp.last_name, s_emp.dept_id, s_dept.name
            FROM   s_emp, s_dept
            WHERE  s_emp.dept_id = s_dept.id
               AND INITCAP(s_emp.last_name) = 'Menchu';

     

테이블 Alias 사용

    ◈테이블 이름을 사용하여 column명을 명확히 할때 테이블 이름이 긴 경우 매우 많은 시간을 요할 때
       테이블의 alias로 column을 명확히 할 수 있다.
    ◈현재의 SELECT 문장에 대해서만 유효하다.
    ◈Alias를 작성한 경우 테이블 이름 대신에 테이블의 alias를 사용하여 columnm참조시 error발생을
       방지한다.

    실습 : 모든 고객에 대해 고객 이름, 지역번호 및 지역이름을 display 하고, 테이블 참조를 단축하기
               위해 테이블 alias를 지속적으로 사용해야 한다.

    SQL> SELECT  c.name, c.region_id, r.name
             FROM    s_customer c, s_region r
             WHERE   c.region_id = r.id;

     

    실습 : commission을 받는 모든 사원들의 성, 지역 이름 및 commission_pct를 출력하시오.

    SQL> SELECT  e.last_name, r.name, e.commission_pct
             FROM    s_emp e, s_dept d, s_region r
             WHERE   e.dept_id = d.id
                  AND  d.region_id = r.id  AND  e.commission_pct > 0;

     

3. Non-Equijoin

    ◈Non-Equijoin은 한 테이블의 어떤 column도 join할 테이블의 한 column에 직접적으로 일치하지
       않을 시 사용한다.
    ◈조인조건은 등등(=)이외의 연산자를 갖는다.
    ◈예를들어 EMP와 SALGRADE 사이의 관련성은 EMP 테이블의 어떠한 column도 직접적으로
       SALGRADE 테이블의 한 column에 상응하지 않기 때문에 Non-Equijoin이다.
    ※ <= 및 >= 같은 다른 연산자를 사용가능하나 BETWEEN이 가장 단순하다.
        BETWEEN 사용시 하한값을 먼저 명시하고 상한값을 나중에 명시한다는 것을 명심하라.


    실습 : 사원의 급여 등급을 평가하기 위한 Non-Equijoin을 사용하라.급여는 하한값과 상한값의
               사이에 있어야 한다.

    SQL> SELECT e.ename, e.sal, s.grade
             FROM   emp e, salgrade s
             WHERE  e.sal BETWEEN s.losal AND s.hisal;

     

4. Outer Join

    ◈정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 outer join을 사용한다.
    ◈조인시킬 값이 없는 조인측에서 "(+)"를 위치 시킨다. 즉, 정보가 부족한 조인측에 위치한다.
    ◈Outer join을 포함하는 조건은 IN 연산자를 사용할 수 없고, OR 연산자에 의해 다른 하나의 조건에
       연결 불가능하다.
    ◈(+)연산자는 한 개 이상의 NULL 행을 생성하고 정보가 충분한 테이블의 한 개 이상의 행들이 이런
       NULL 행에 조인된다.

♣ Syntax

      SELECT   table.column, table.column
      FROM     table1.table2
      WHERE    table1.column = table2.column(+);

        또는

      SELECT   table.column, table.column
      FROM     table1.table2
      WHERE    table1.column(+) = table2.column;

    ◈ 여기서, (+)는 Outer join 기호이다. 이 기호는 WHERE절 조건의 어느측에 올 수 있으나
        양측 모두에는 올 수 없다. Outer join 연산자를 일치하는 행이 없는 테이블쪽에 두라. 
     

♣ Outer join의 제약사항

    ◈Outer join은 표현식의 한 측에만 올수 있는데 정보가 부재한 쪽에 둔다.
       다른 테이블의 어떠한column과도 일치하지 않는 한 테이블의 행을 돌려준다.
    ◈Outer join을 포함하는 조건은 IN 연산자를 사용할 수가 없고 OR 연산자에 의해 다른 하나의 조건에
       연결 불가능하다. 
     

    실습 : 모든 고객에 대해 담당 영업사원 이름과 사번 및 고객 이름을 출력하라.
               이때 고객을 담당하는 담당 영업사원이 없더라도 고객 이름을 출력하도록 하라.

    SQL> SELECT e.last_name, e.id, c.name
             FROM   s_emp e, s_customer c
             WHERE  e.id(+) = c.sales_rep_id
             ORDER BY e.id;

     

5. Self Join

    ◈Self join을 사용하여 한 테이블의 행들을 같은 테이블의 행들과 조인한다.
    ◈한개의 테이블을 두 개의 별도의 테이블처럼 사용하기 위해 테이블 alias를 사용하여 한 테이블을
       자체적으로 조인가능하다.
    ◈FROM절 상에서 두 개의 테이블을 시뮬레이트하기 위해 아래 예는 같은 테이블인 S_EMP 테이블에
       대해 alias를 사용하고 있다.
    ◈이 예에서 WHERE절은 사원의 관리자 번호가 관리자에 대한 직원번호와 일치하는것을 의미하는 조인
       조건을 포함하고 있다.
     

    실습 : 사원의 이름과 각자의 관리자를 출력하시오.

    SQL> SELECT  worker.last_name||' 관리자 '||manager.last_name
             FROM    s_emp worker, s_emp manager
             WHERE   worker.manager_id = manager.id;