블로그 이미지
'무른모'란 부드럽다라는 뜻을 가진 '무르다'라는 말과 도구, 연장을 뜻하는 '연모'라는 순 우리말의 합성어로 소프트웨어를 말합니다. seanhigher

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total633,812
Today36
Yesterday88
데이터베이스에서 가장 중요한 역할을 하는 것은 '조인' 연산이라고 할 수 있다. 데이터베이스에 많은 데이터가 있지만, 그 데이터를 얼마나 효율적으로 가져오는지가 중요하다. 이 과정이 조인이 필요한 이유이다.



JOIN 연산
일반적으로 데이터베이스에 있는 데이터를 가져오기 위해서는 'SELECT'문을 사용하게 되는데, 기본적인 셀렉트 문을 사용해서는 하나의 테이블안에 있는 데이터밖에는 가져오지 못한다는 문제점이 있다. 조인 연산은 둘 이상의 테이블에 있는 데이터를 가져올 수 있도록 해준다. 만일 employees 테이블에 'King' 이라는 사람의 부서 이름을 구하고자 한다. 하지만, employees 테이블에는 department_id 만 있을뿐 부서의 이름은 찾을 수가 없다. 하지만, departments 라는 테이블에서 department_id를 통해 부서의 이름을 알 수는 있다. JOIN 연산을 하지 않는다면, employees 에서 department_id 를 검색한후 department_id 를 가지고 departments 테이블에서 찾아낸 department_id 에 맞는 부서의 이름을 검색하여 결과를 얻어내야 할 것이다. 하지만, JOIN 연산을 사용한다면 다음과 같이 한번에 표현하는 것이 가능하다.

SELECT employees.last_name, departments.department_name
  FROM employees JOIN departments ON employees.department_id = departments.department_id
    WHERE employees.last_name = 'King';



기본적인 JOIN.
표준 조인방법은 위의것과 같다. JOIN 에 데이터를 추가하고자 하는 테이블의 이름을 써넣고, ON 에는 두 테이블을 이어주는 관계조건을 명시해주면 된다. 위에서는 테이블의 이름을 계속써야 하기때문에 조금 불편한면이 있다. 각 테이블명에 앨리어스 기능을 사용하는 것이 가능하다. 'FROM employees e' 라고 하면 employees 를 써야 하는 부분에는 'e' 를 써주면 된다. e.last_name과 같이 사용할 수 있다.

SELECT e.last_name, d.department_name
  FROM employees e JOIN departments d ON e.department_id = d.department_id
    WHERE e.last_name = 'King';

조금은 더 간단하게 사용하는 것이 가능하다. 위의 방법은 표준 조인이라고 불린다. 그리고 위의 방법 외에 WHERE 문에 조건을  더 주는 방법으로 JOIN문을 사용하지 않고 조인을 사용하는 것이 가능하다.

SELECT e.last_name, d.department_name
  FROM employees e, departments d
    WHERE e.last_name = 'King' AND e.department_id = d.department_id;



좀더 많이 조인하기.
그렇다면 두개이상의 조인은 어떻게 해야할까? 밑의 WHERE 을 사용하는 방법을 사용한다면 AND 를 사용해서 조건을 추가함으로써 쉽게 조인 테이블을 추가할 수 있다.

SELECT e.last_name, d.department_name
  FROM employees e, departments d, locations l
    WHERE e.last_name = 'King' AND e.department_id = d.department_id AND d.location_id = l.location_id;

위의 방법보다는 조금 더 복잡하게 보일 수 있겠지만, 표준조인 방식으로는 JOIN 과 ON 을 추가하여 조인 테이블을 추가해야 한다.

SELECT e.last_name, d.department_name
  FROM employees e JOIN departments d ON e.department_id = d.department_id
    JOIN locations l ON d.location_id = l.location_id
      WHERE e.last_name = 'King';

WHERE 보다는 쿼리문이 조금 길어진다는 단점이 있지만, 원하는 조건을 WHERE 문에만 쓸 수 있어서 찾고자 하는 조건을 좀더 명확하게 알 수 있다는 장점이 있다. 하지만, 어떠한 방식을 취하는것은 개발자의 몫이다.



모든 데이터를 출력하는 OUTER JOIN.
HR 계정에서 다음의 쿼리문을 실행해보자.

SELECT employee_id, last_name, hire_date  FROM employees e, departments d
    WHERE TO_CHAR(hire_date, 'YYYY-MM') BETWEEN '1999-01' AND '1999-06';

11개의 결과값이 나오는 것을 확인할 수 있다. 그렇다면 조인 연산을 이용해서 부서명까지 출력을 해보면...

SELECT e.employee_id, e.last_name, e.hire_date, d.department_name
  FROM employees e, departments d
    WHERE e.department_id = d.department_id
      AND TO_CHAR(hire_date, 'YYYY-MM') BETWEEN '1999-01' AND '1999-06';

결과값이 뭔가 이상하다. 11개의 행이 나와야 하는데, 10개의 행밖에 나오지 않는다. 그 이유가 무엇일까?? 이유는 employee 테이블에 있는 데이터 중에서 department_id 값이 널인것이 있기 때문이다. 부서명을 출력하기 위해서 조인연산을 사용했지만, department_id 가 없는 것에 대해서는 조건이 만족하지 않기 때문에 아예 결과가 출력되지 않는 것이다. 그렇다면 그 결과는 영영 출력할 수 없는 것일까? 아웃터 조인이라는 방법은 이러한 문제점을 해결해 준다. employees 에는 있지만, departments 에 없는 데이터를 출력하기 위해서는 WHERE 조건을 e.department_id = d.department_id(+) 라고 '(+)'만 추가해주면 된다. 그렇게 되면 원하던 11개의 결과를 얻을 수 있을 것이다.

    WHERE e.department_id = d.department_id(+)

하지만 표준 조인을 사용하는 방식에서는 조금 다르게 사용을 해야 한다. JOIN 대신에 LEFT JOIN 이나 RIGHT JOIN 을 사용해야 한다.

  FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id

표준조인에서는 위의 방법과는 다르게 데이터가 있는 employees 쪽으로 표시를 해주어야 한다. 만일 위의 employees 와 departments 의 위치가 바뀐다면 RIGHT 를 사용해야 할 것이다.

  FROM department d RIGHT JOIN employees e ON e.department_id = d.department_id

가끔은 표준이 아닌것이 훨씬 더 편하게 사용되는것이 많은것 같은 생각도 문득 든다.

Posted by seanhigher

댓글을 달아 주세요

최근에 달린 댓글

글 보관함