[Database] 서브쿼리
▋서브쿼리 (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에 조건을 걸어주는 값으로 사용된다.