Database (Oracle)

[Database] 서브쿼리

Jenny Noh 2024. 2. 5. 18:59

▋서브쿼리 (Sub query)란

서브쿼리란 쿼리문 안에 포함된 쿼리문이다. 서브쿼리를 포함하고 있는 바깥의 쿼리문을 메인쿼리라고 한다. 

서브쿼리의 결과로 반환되는 데이터나 값을 메인쿼리에서 참조하여 조건이나 조회 결과로 사용한다. 

 

1) 메인쿼리

  - 실행의 결과가 조회되는 바깥부분의 쿼리

  - 서브쿼리의 결과에 의해 실행되는 쿼리

 

2) 서브쿼리

  - 메인쿼리 안쪽에 위치한 쿼리

  - 실행결과가 메인쿼리의 조건이나 결과로 사용됨

  - order by를 사용할 수 없음 (from절에서는 가능)

 

 

▋서브쿼리의 종류

서브쿼리는 반환되는 결과값의 개수에 따라 단일행 서브쿼리와 복수행 서브쿼리로 나뉜다.

 

1) 단일행 서브쿼리: 결과가 하나만 나오는 서브쿼리

 

2) 복수행 서브쿼리: 결과가 여러개 나오는 서브쿼리

  - 메인쿼리의 WHERE 절에서 in 연산자와 함께 사용

  - in, any, all, exists 연산자와 함께 사용

 

 

▋서브쿼리 사용 위치 - 단일행 서브쿼리 

SELECT 절에서 사용

이름이 'Bruce', 'Daniel'인 직원의 성을 조회하는 쿼리이다.

Select 절에 넣어주면 아래와 같이 별도의 열으로 데이터를 받을 수 있다. 

 

 

FROM 절에서 사용

03년도 3월 이전에 입사한 직원 중 급여가 3번째로 많은 직원의 first_name, salary, hire_date, department_id를 조회하는 쿼리이다.

From 절에 서브쿼리가 이중으로 쓰였다.

 

- 먼저, hire_date 기준으로 3월 이전에 입사한 직원을 반환하고 salary를 내림차순기준으로 정렬한 table view를 반환한다. (쿼리 결과 = temp)

*(서브쿼리) nickname으로 받으면 해당 쿼리의 결과를 nickname으로 바깥 쿼리에서 사용할 수 있다. 

- temp의 결과에 일련번호 ROWNUM을 붙여서 반환한다. 

- ROWNUM이 3인 데이터를 반환하면 급여가 3번째로 많은 직원의 정보를 조회할 수 있다.

 

 

 

WHERE 절에서 사용

사원번호가 109인 사원보다 급여가 많은 직원의 first_name, job_id, salary를 조회하는 쿼리이다.

서브쿼리의 결과로 9000이 반환되어 메인쿼리에서 salary에 조건을 걸어주는 값으로 사용된다.