서브쿼리
- 쿼리 안에 있는 쿼리를 의미
- SELECT, INSERT, UPDATE, DELETE 등에 사용 가능
- SELECT 문에서는 SELECT, FROM, WHERE, HAVING 절에서 사용 가능
사용목적
- 서브쿼리 사용 위치에 따라 목적이 달라짐
- 다른 행과의 비교 및 연산을 위해 주로 사용
종류
1. 서브쿼리 형태에 따른 분류
1) 단일 행 서브쿼리
2) 다중 행 서브쿼리
3) 다중 컬럼 서브쿼리
2. 위치에 따른 분류
1) 스칼라 서브쿼리
- SELECT 절에 사용하는 서브쿼리
2) 인라인뷰
- FROM 절에 사용하는 서브쿼리
3) 일반 서브쿼리
- WHERE 절에 사용하는 서브쿼리
3. 메인쿼리와의 관계에 따른 분류
1) 비연관 서브쿼리
- 서브쿼리 내 메인쿼리의 컬럼이 존재하지 않는 서브쿼리
2) 연관 서브쿼리
- 서브 쿼리 내 메인쿼리의 컬럼이 존재하는 서브쿼리
단일 행 서브쿼리
- 서브쿼리 결과가 하나의 행인 경우의 서브쿼리
- 단일 행 서브쿼리 결과가 단 하나의 상수로 먼저 계산되어 메인쿼리절의 각 행과 비교 가능
- 단 하나의 상수와 비교하는 비교연산자사용 가능(=, !=, >, < 등)
예제) EMP 테이블에서 전체 직원의 평균 급여보다 높은 급여를 받는 직원정보 출력


예제) EMP 테이블에서 전체 직원 중 가장 높은 급여를 받는 직원정보 출력

다중 행 서브쿼리
- 서브쿼리 결과가 둘 이상의 행인 경우 서브쿼리
- 비교해야 할 상수가 둘 이상이므로 단순비교연산자(=, >, < 등) 사용 불가
- IN, ANY, ALL 등의 연산자 사용 가능
* 다중 행 서브 쿼리 연산자
| 연산자 | 사용법 | 설명 |
| IN | WHERE COL1 IN (SELECT ...) | 서브쿼리 결과와 값이 같은 모든 행 출력 |
| ALL | WHERE COL 1 > ALL (SELECT ...) | 서브쿼리 결과 중 최댓값보다 큰 값을 갖는 모든 행 출력 |
| WHERE COL 1 < ALL (SELECT ...) | 서브쿼리 결과 중 최솟값보다 작은 값을 갖는 모든 행 출력 | |
| ANY | WHERE COL1 > ANY (SELECT ...) | 서브쿼리 결과 중 최솟값보다 큰 값을 갖는 모든 행 출력 |
| WHERE COL 1 < ANY (SELECT ...) | 서브쿼리 결과 중 최댓값보다 작은 값을 갖는 모든 행 출력 |
예제) 2024년 7월에 판매된 모든 차량의 모델명, 차량연식과 요금을 함께 출력



예제) ELECTRIC 차량 렌트요금보다 비싼 차량의 모델명과 차량타입, 연식 및 렌트요금을 출력

* ELECTRIC 차량이 여러 대이므로 서브쿼리 결과가 여러 행으로 반환됨, 따라서 단순 비교 연산자인 > 조건을 사용할 수 없음
-> 여러 대 중 어떤 차량의 가격보다 비싼지를 먼저 결정해야 함
해결 1) 다중 행 서브쿼리 연산자 사용

** ALL 연산자를 사용하여 ELECTRIC 차량 중 가장 비싼 가격보다 높은 가격을 가진 차량을 확인하는 문장작성 가능
해결2) 서브쿼리를 단일 행 서브쿼리로 변경(최대 가격 한 개만 출력되도록)

다중 컬럼 서브쿼리
- 서브쿼리 결과가 두 개 이상의 컬럼으로 구성된 서브쿼리(세 컬럼 비교 가능)
- 메인쿼리의 여러 컬럼과 서브쿼리의 여러 컬럼이 서로 일치하는 경우의 행 추출 시 사용
- 반드시 메인쿼리의 여러 컬럼을 괄호로 묶어서 비교해야 함
예제) 각 차량타입별로 요금이 가장 저렴한 차량의 모델명과 차량타입, 렌트비용을 출력


(상호) 연관 서브쿼리
- 서브쿼리가 메인쿼리의 컬럼 정보를 가지고 있는 형태의 서브쿼리
- 서브쿼리가 메인쿼리의 특정 컬럼값을 필요로 하는 경우 사용됨
예제) 각 부서별 평균급여보다 높은 급여를 받는 직원을 모두 출력

STEP1) 첫 번째 행의 급여(SAL)를 확인한다.
STEP2) 해당 직원이 속한 부서의 평균 급여를 확인한다.
STEP3) 평균급여보다 높으면 출력, 작거나 같으면 생략한다.
STEP4) 위 행위를 모든 행에 대해 반복한다.

예제) 각 차량타입별로 평균 렌트요금보다 저렴한 차량의 모델명과 차량타입, 렌트비용을 출력

인라인뷰(Inlike View)
- FROM 절에 사용하는 서브쿼리
- 메인쿼리에서 가상 테이블처럼 사용하기 위해 작성
- 메인쿼리 테이블과 조인 가능
예제) 각 차량타입별로 요금이 가장 비싼 차량의 모델명과 차량타입, 렌트비용을 출력(인라인뷰)


예제) 각 차량타입별로 평균 렌트요금보다 저렴한 차량의 모델명과 차량타입, 렌트비용을 출력

스칼라 서브쿼리
- SELECT 절에 사용하는 서브쿼리
- 서브쿼리 결과를 메인쿼리의 하나의 컬럼처럼 표현하기 위해 사용
- 각 행별로 단 하나의 결과만 허용
예제) 렌트 평균 금액과 비교하기 위해 각 차종의 모델명, 연식, 차량타입, 렌트 요금과 함께 전체 평균 요금을 함께 출력

*AVG는 집계함수로 데이터를 요약하는 기능을 가지므로 전체를 출력하는 다른 컬럼들과 함께 사용 불가

예제) 각 차량의 모델명, 연식, 차량타입, 렌트 요금과 함께 각 차량의 타입별 평균 요금과 함께 출력
