[DB] Subquery

무1민·2023년 4월 16일
0

데이터베이스

목록 보기
5/11

서브 쿼리 (Subquery)

  • 서브 쿼리(subquery)란 다른 쿼리 내부에 포함되어 있는 SELECT 문을 의미한다.

  • 서브 쿼리를 포함하고 있는 쿼리를 외부 쿼리(outer query) 또는 메인 쿼리라고 부르며, 서브 쿼리는 내부 쿼리(inner query)라고도 부른다.

  • 서브 쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호() 로 감싸져 있어야 한다.

  • 서브 쿼리의 종류

    • 중첩 서브 쿼리(Nested Subquery) WHERE 문에 작성하는 서브 쿼리
      1. 단일 행
      2. 복수(다중) 행
      3. 다중 컬럼
    • 인라인 뷰(Inline View) - FROM 문에 작성하는 서브 쿼리
    • 스칼라 서브 쿼리(Scalar Subquery) - SELECT 문에 작성하는 서브 쿼리
  • 주의 사항

    • 서브 쿼리는 반드시 ()로 감싸야 한다.
    • 서브 쿼리는 단일 행 또는 다중 행 비교 연산자와 함께 사용된다.
  • 서브 쿼리가 사용이 가능한 곳

    • SELECT
    • FROM
    • WHERE
    • HAVING
    • ORDER BY
    • INSERT문의 VALUES
    • UPDATE문의 SET

Nested Subquery - 단일 행

  • 서브 쿼리의 결과가 단일행을 리턴
  • 부서가 'seattle'(대소문자 구분)에 있는 부서의 부서 번호, 부서 이름

Nested Subquery - 다중 행

  • 서브 쿼리의 결과가 다중행을 리턴 : IN, ANY, ALL

  • IN

    • 근무 도시가 'seattle'(대소문자 구분)인 사원의 사번, 이름.

  • ANY

  • 적어도 하나만 만족하면 true

    • 모든 사원 중 적어도(최소 급여자보다) 30번 부서에서 근무하는 사원의 급여보다 많이 받는 사원의 사번, 이름, 급여, 부서번호

  • ALL

  • 모두 만족하면 true

    • 30번 부서에서 근무하는 모든(최대 급여자보다) 사원들보다 급여를 많이 받는 사원

Nested Subquery - 다중 열

  • 서브 쿼리의 결과가 다중 열을 리턴

    • 커미션을 받는 사원중 매니저 사번이 148인 사원의 급여와 부서번호가 일치하는 사원의 사번, 이름

인라인 뷰(Inline View)

  • FROM절에 사용되는 서브 쿼리를 인라인 뷰(Inline View)라 한다.

  • 서브 쿼리가 FROM절에 사용되면 뷰(View)처럼 결과가 동적으로 생성된 테이블로 사용 가능

  • 임시적인 뷰이기 때문에 데이터베이스에는 저장되지 않는다.

  • 동적으로 생성된 테이블이기 때문에 column을 자유롭게 참조 가능

  • 모든 사원의 평균 급여보다 적게 받는 사원들과 같은 부서에서 근무하는 사원의 사번, 이름, 급여, 부서번호

인라인 뷰(Inline View) - TopN 질의

  • 모든 사원의 사번, 이름, 급여를 출력
    • 사원 정보를 급여순으로 정렬
    • 한 페이지당 5명이 출력
    • 현재 페이지가 3페이지라고 가정. (급여 순 11등 ~ 15등까지 출력)

인라인 뷰 - limit 활용 (MySQL)

  • 모든 사원의 사번, 이름, 급여를 출력
    • 사원 정보를 급여순으로 정렬
    • 한 페이지당 5명이 출력
    • 현재 페이지가 3페이지라고 가정(11~15)

스칼라 서브 쿼리 (Scalar Subquery)

  • SELECT 절에 있는 서브 쿼리
  • 한 개의 행만 반환

  • 직급 아이디가 IT_PROG인 사원의 사번, 이름, 직급 아이디, 부서이름

서브 쿼리 활용

  • 서브 쿼리를 이용한 CREATE

  • employees table을 emp_copy라는 이름으로 복사(컬럼 이름 동일)

  • employees table의 구조만 emp_blank라는 이름으로 생성(컬럼 이름 동일)

  • 50번 부서의 사번(eid), 이름(name), 급여(sal), 부서번호(did)만 emp50이라는 이름으로 생성.

  • INSERT

  • employees table에서 부서번호가 80인 사원의 모든 정보를 emp_blank에 insert

  • UPDATE

  • employees table의 모든 사원의 평균 급여보다 적게 받는 emp50 table의 사원의 급여를 500 인상

  • DELETE

profile
야호

0개의 댓글