기본적인 조인연산.

티스토리 메뉴 펼치기 댓글수0

Dev Center/DB + JSP start

기본적인 조인연산.

seanhigher
댓글수0
데이터베이스에서 가장 중요한 역할을 하는 것은 '조인' 연산이라고 할 수 있다. 데이터베이스에 많은 데이터가 있지만, 그 데이터를 얼마나 효율적으로 가져오는지가 중요하다. 이 과정이 조인이 필요한 이유이다.



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

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

맨위로