본문 바로가기
SQL

SQL_서브쿼리

by 유서담 2023. 12. 17.

서브쿼리(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 조건식));

 

 

 

서브쿼리의 예시

 

서브쿼리안에 직원 테이블에 평균(급여)를 WHERE절에 따로

 

 

 

 

단일행 서브쿼리 예시

 

=, >  를 사용한 단일행 서브쿼리

 

 

다중행 서브쿼리 예시

 

ALL과 ANY의 결과가 차이가 있다

 

예시에도 있지만

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