서브쿼리(SUB QUERY)
- SELECT문 내부에 정의된 SELECT문을 서브쿼리라고 한다
- 서브쿼리는 WHERE절의 조건식에서 사용되는 값을 제공한다
- 이 경우에 조건식에서 사용되는 값이 SQL을 실행해야만 획득가능한 값이 경우가 많다
서브쿼리의 형식
SELECT 컬럼, 컬럼
FROM 테이블명
WHERE 조건식 연산자 ( SELECT 컬럼
FROM 테이블명
[WHERE 조건식])
-- 전체 사원의 평균급여보다 급여를 적게 받는 사원들의 사원아이디, 이름, 급여를 조회하기
-- 조건식에서 사원의 급여와 비교되는 전체사원의 평균급여는 select문의 실행결과로 획득되는 값이다.
-- 따라서, where절에 사원들의 전체 평급을 조회하는 select문(서브쿼리)이 필요하다.
select employee_id, first_name, salary
from employees
where salary < (select avg(salary)
from employees)
서브쿼리의 특징
- 한번만 실행된다
- 메인 쿼리보다 먼저 실행된다
- 서브쿼리의 실행결과가 메인 쿼리의 조건식에서 사용된다
서브쿼리의 주의사항
- 서브쿼리는 반드시 괄호안에 작성한다
- 서브쿼리는 조건식에 오른쪽에 위치시켜서 가독성을 높인다
- 서브쿼리의 실행결과가 단일행인지 다중행인지 조사해서 적절한 연산자를 사용한다
내포된 SQL문의 구분 ( 서브쿼리의 종류 )
- 서브쿼리 : WHERE절이나 HAVING절에서 조건식에 사용되는 값을 제공하는 SQL문
- 인라인뷰 : FROM절에서 가상의 테이블(가상의 테이블을 보통 뷰라고 한다)을 제공하는 SQL문
- 스칼라 서브쿼리 : SELECT절에서 사용되는 서브쿼리다. 보통 값은 하나만 반환한다
- 상호연관 서브쿼리 : 내표된 SQL문에서 메인쿼리의 컬럼을 참조하는 서브쿼리다
단일행 서브쿼리
- 서브쿼리의 실행결과로 한 행만 반환된다
- 단일행 비교 연산자 ( = , > , >= , < , <= , <> )
다중행 서브쿼리
- 서브쿼리의 실행결과로 여러 행이 반환된다
- 다중행 비교 연산자 ( IN, ANY, ALL )
단일행 서브쿼리 | 다중행 서브쿼리 |
= | IN |
<> | NOT IN |
> | >ANY, >ALL |
< | <ANY, <ALL |
다중열 서브쿼리
- 두 개 이상의 컬럼값이 조회조건으로 반환되는 서브쿼리다
-- 다중열 서브쿼리 형식
select column, column, ....
from table1
where (column1, column2) in (select column1, column2
from table2)
HAVING절에서 서브쿼리 사용하기
- GROUP BY절을 사용해서 그룹화하고 그룹함수를 실행한 결과를 필터링하는 HAVING절에도 서브쿼리를 사용할 수 있다
-- 사용예시
select column, 그룹함수
from table1
group by column
having 그룹함수 연산자 (select column
from table)
상호연관 서브쿼리
- 서브쿼리가 메인쿼리문에서 사용(참조)되는 컬럼을 참조할 때 상호연관 서브쿼리가 된다
- 상호연관 서브쿼리는 메인쿼리문에서 처리되는 각 행에 대해서 한번씩 실행된다
-- 사용예시
select outer.column1, outer.column2, ...
from table1 outer
where column 연산자 (select column1
from table2
where column = outer.column3)
-- 서브쿼리에서 메인쿼리에서 사용되는 테이블의 컬럼을 참조한다.
-- 서브쿼리에서는 메인쿼리의 테이블의 별칭을 사용해서 메인쿼리에서 사용되는 테이블의 컬럼을 참조한다.
스칼라 서브쿼리
- 하나의 행에서 하나의 값만 반환하는 서브쿼리다
- 다중행X , 다중열X, 단일행-단일열 O
- 스칼라 서브쿼리는 SELECT절, INSERT문의 VALUES에서 사용할 수 있다
- 스칼라 서브쿼리는 DECODE 및 CASE의 조건 및 표현식에서 사용할 수 있다
-- 사용예시
select col1, col2, (select col3 from table2 where 조건식)
from table1;
insert into table1
(col1, col2, col3, ...)
values
(값, 값, (select col4 from table2 where 조건식));
서브쿼리의 예시
단일행 서브쿼리 예시
다중행 서브쿼리 예시
예시에도 있지만
ALL은 범위안에 있는 모든 값들보다 커야한다 ( AND와 비슷하다고 생각하면 편하다 )
ANY는 범위안에 있는 값들 중 하나만 충족되도 된다 ( OR와 비슷 )
다중열 서브쿼리 예시
상호연관 서브쿼리 예시
'SQL' 카테고리의 다른 글
SQL_시퀀스, 트랜잭션, 무결성제약조건 (0) | 2023.12.19 |
---|---|
SQL_DDL과 정규화 (1) | 2023.12.18 |
SQL_그룹함수(GROUP BY, HAVING) (0) | 2023.12.14 |
SQL_Join (0) | 2023.12.13 |
SQL_오라클 내장함수(변환함수, 기타함수) (0) | 2023.12.12 |