좀더 다양한 방법으로 조인한기.(셀프조인, 서브쿼리)

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

Dev Center/DB + JSP start

좀더 다양한 방법으로 조인한기.(셀프조인, 서브쿼리)

seanhigher
댓글수0
조인을 하게되면 여러개의 테이블에서 데이터를 한번에 참조하는것이 가능하다. 자신의 테이블에서 데이터를 참조하거나, 셀렉트의 결과를 다시 참조하는 형태의 서브쿼리로 좀더 다양한 방법으로 참조하는 것이 가능하다.



셀프조인
가끔은 이런 조건이 필요한 경우가 있다. 'King'이라는 사람의 매니저 이름을 알고 싶다면.. 매니저의 아이디는 직원 아이디로 사용될 수도 있다. 자신의 테이블에 없는 정보를 얻기 위해서는 조인을 해야 하는데... 자기 자신의 테이블도 조인을 하는것이 가능하다. 그것이 셀프조인인데, 일반적인 조인의 사용방법과 같은 방법으로 사용할 수 있다. 주의해야 할 점은 같은 테이블을 참조하는 것이기 때문에 꼭 다름 이름으로 앨리어스를 주어야 하고, 각 컬럼마다 테이블 이름을 명시해 주어야 에러가 나지 않게 된다. 조건을 명시할때도 어떤 테이블을 참조할것인 조금은 고민을 해야 한다.

SELECT e1.last_name, e2.last_name
  FROM employees e1 JOIN employees e2 ON e1.manager_id = e2.employee_id
    WHERE e1.last_name = 'King';

위의 것은 표준조인방식이지만, WHERE 문을 사용하는 방식으로 추가하는것도 동일하게 적용된다.



서브쿼리
다른 테이블의 데이터를 참조하는 방법에는 조인을 하는 방법 외에도 서브쿼리를 사용하는 방법이 있다. 하나의 쿼리문을 사용해서 나온 결과값을 가지고, 또 다른 쿼리문의 조건으로 사용하는 것이다. 사용하는방법은 매우 간단하다. 단지 괄호문 안에 넣어주면 된다. 당연한 이야기일 수도 있겠지만, 서브쿼리문은 WHERE 과 HAVING 과 같은 조건문에서만 사용이 가능하다.

SELECT employee_id, last_name, salary
  FROM employees
    WHERE salary > ( SELECT MAX(salary) FROM employee WHERE deparment_id = 20 );

위의 쿼리문을 해석하면, '부서번호가 20인 사원들중 가장높은 급여보다 더 많은 급여를 받는 사람들의 정보를 출력하라'이다. 앞의 조건은 '부서번호가 20인 사원들중 가장높은 급여'를 구해서 그 급여보다 높은 사람들을 구하는 방법으로 나눌 수 있다. 하나의 결과를 다른 쿼리문에 적용을 하는 것이다. 이것은 전형적인 서브쿼리이다. 위의 조건식은 다음과 같은 방법으로도 표현이 가능하다.

    WHERE salary > ALL( SELECT salary FROM employee WHERE deparment_id = 20 );

MAX() 함수를 사용하는 경우에는 가장 큰 값을 반환하지만, 위의 경우에는 참조하는 모든 값보다 높은것을 의미한다. 부서번호가 20인 모든 사람들의 급여보다 높은 사람들을 비교하는 것이다. 결국은 부서번호가 20인 사람들 중에서 가장 높은 급여를 비교하게 되는 것이다. 이것과 반대로 ANY를 사용할 수 있는데, 모든 사람들이 아니라, 어떤 사람들의 급여보다 높으면 되는 것이다. 쉽게 ALL은 조건에서 자기 자신을 포함하지 않지만, ANY는 자기 자신을 포함한다고 할 수 있다.

서브쿼리를 사용할때 주의해야 할점은 서브쿼리에서 반환하는 내용과 비교하고자 하는 내용의 형식과 갯수가 일치해야 한다는 것이다. 만일 각 부서별로 가장 많은 급여를 받는 사람들의 명단을 알고자 한다면..

SELECT last_name, salary, job_id
  FROM employees
    WHERE (salary, job_id) IN ( SELECT MAX(salary), job_id FROM employees GROUP BY gob_id);

서브쿼리에서 MAX 와 job_id 를 반환하기 때문에 조건에서도 salary 와 job_id 를 함께 비교해야 한다. 또 반환하는 내용이 둘 이상일 경우에는 IN 또는 NOT IN 을 사용하여 조건을 비교하는 것이 가능하다.

맨위로