본문 바로가기

국비필기노트/DBMS_Oracle

데이터베이스(DBMS)_서브쿼리(subQuery)

▶서브쿼리(subQuery)란?

 

메인쿼리(Main Query)에 반대되는 개념으로 이름을 붙힌 것으로 메인쿼리를 구성하는 소단위 쿼리이다.

 

 

▶서브쿼리(subQuery) 사용이유

 

예를들어 평균급여보다 적게 받는 사람을 구하는 쿼리문을 작성한다고 해보자

 

*평균 급여를 구하는 쿼리문

1
2
3
SELECT round(avg(SALARY))
FROM EMPLOYEES e 
;
-- 6,462
cs

 

우린 우선 평균 급여를 구하는 쿼리문을 작성하여 평균 값을 구한 후 

 

*평균급여(6462)보다 적게 받는 직원을 구하는 쿼리문

 

 

1
2
3
4
5
SELECT EMPLOYEE_ID , FIRST_NAME , LAST_NAME, SALARY  
FROM EMPLOYEES e 
WHERE SALARY < 6462
ORDER BY SALARY 
;
cs

 

구해진 평균값을 통해 where절로 데이터를 구할 것이다. 그런데 연봉은 언제든지 변경이 될 수 있다.다음달에 1명이 퇴사할 수 도 있고 내년엔 직원들의 월급이 일괄적으로 인상되어 전체적인 평균값이 올라갈 수 있는것이다. 쿼리문을 유동적으로 사용을 할 수 없으니 사람들은 많은 불편을 느꼈고 사람들은 서브쿼리문을 생각해낸다.

 

 

▶서브쿼리(subQuery) 사용방법

 

*서브쿼리문을 활용한 평균급여보다 적은 급여를 받는 직원의 이름을 구하는 쿼리문

 

1
2
3
4
5
SELECT EMPLOYEE_ID , FIRST_NAME , LAST_NAME, SALARY  
FROM EMPLOYEES e 
WHERE SALARY < (SELECT round(avg(SALARY)) FROM EMPLOYEES e )
ORDER BY SALARY 
;
cs

 

서브쿼리문은 기본적으로 Main쿼리 문에 넣어서 사용을 한다.

서브쿼리문의 처리해야하는 길이가 길지 않으면 가독성을 위해 일자로 처리를 하는 것이 보통이다.

 

 

1
2
3
4
5
SELECT EMPLOYEE_ID , FIRST_NAME , LAST_NAME, SALARY 
      , (SELECT round(avg(SALARY)) FROM EMPLOYEES e )
FROM EMPLOYEES e 
WHERE SALARY < (SELECT round(avg(SALARY)) FROM EMPLOYEES e )
ORDER BY SALARY 
cs

 

서브쿼리문은 select, insert, deletel, update 모두 사용이 가능하며 서브 쿼리의 결과 집합을 메인 쿼리가 중간 결과값으로 사용한다. 해당 쿼리문은 select 결과값이 6462가 되어야하니 조건문 where에 넣어 데이터를 출력했다.

 

where 절에는 직계함수를 사용할 수 없어 havaing 절 혹은 group by를 사용해야하는데 굳이 그룹으로 묶을 필요가 없는 경우에 서브쿼리를 활용할 수도 있다.