SQL 심화(8)_SQL Subquery : 스칼라, 인라인 뷰, 중첩 서브쿼리

Jio.B·2023년 7월 27일
0

Subquery

[정의 및 특징] 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문

  • 메인쿼리가 서브쿼리를 포함하는 종속적인 관계

  • 서브쿼리는 메인쿼리의 칼럼을 사용할 수 있음

  • 메인쿼리는 서브쿼리의 칼럼을 사용할 수 없음

    [!! 주의 !!]

    • 서브쿼리는 괄호로 묶어서 사용할 것
    • 단일 행 혹은 복수 행 비교연산자와 함께 사용 가능
    • 서브쿼리에서는 order by 사용할 수 없음

[서브쿼리 종류]

  • Scalar Subquery : SELECT 절에 사용
  • Inline View : FROM 절에 사용
  • Nested Subquery : WHERE 절에 사용

Scalar Subquery

  • SELECT 절에 사용
  • (서브쿼리의 select 절) 결과로 하나의 컬럼만을 반환해야함

(예제) 서울은평경찰서의 강도 검거 건수와 서울시 경찰서 전체의 평균 강도 검거 건수를 조회 [!! 주의 !!] 서브쿼리의 select 절에서 두 개 이상의 컬럼을 반환하려할 경우 다음과 같은 에러 발생


Inline View

  • FROM 절에 사용
  • FROM 절에 있는 서브쿼리의 결과는 하나의 테이블로 인지
    = "View table" 이라 지칭
  • 인라인 뷰의 결과값은 하나의 테이블 형태로 반환되어야 함
    (FROM절에는 원래 사용할 테이블을 지정하는 내용이 들어가야 하기 때문에)
    = 즉 기존 테이블 & 인라인 뷰 결과값으로 도출한 테이블 형태의 결과값, 총 두 개의 테이블을 JOIN 하여 최종 결과를 구하는 방식이 핵심
  • 메인쿼리에서는 인라인 뷰에서 조회한 컬럼만 사용 가능함

(예제) 경찰서별로 가장 많이 발생한 범죄 건수와 범죄 유형을 조회


Nested Subquery (single/multiple)

  • WHERE 절에 사용
  • Single Row : 하나의 행을 검색하는 서브쿼리
  • Multiple Row : 하나 이상의 행을 검색하는 서브쿼리
  • Multiple Column : 하나 이상의 열을 검색하는 서브쿼리

1. single row subquery

  • 하나의 행을 검색하는 서브쿼리
  • 서브쿼리를 비교연산자(=, <, >, ...)와 함께 사용할 경우,
    서브쿼리의 검색 결과는 한 개 행(row)의 결과값 만을 가져야 함

    (주의 1) 서브쿼리에 비교연산자가 있다면 싱글로우 쿼리를 사용해야함

(주의 2) 서브쿼리의 결과값이 두 개 이상이면 에러 발생


2. multiple row subquery

  • 하나 이상의 행(row)을 검색하는 서브쿼리

2-1. multiple row sub with IN

  • 제시한 목록 중에 결과값이 포함되어 있으면 반환

(예제) SNL에 출연한 영화배우 조회
참고 : 이런 경우 IN보다는 JOIN을 사용하는 것이 보다 효율적임

2-2. multiple row sub with EXISTS

  • 서브쿼리에 결과값이 있으면 반환


(예제) 범죄 검거 혹은 발생 건수가 2000건 보다 큰 경찰서 조회

2-3. multiple row sub with ANY

  • 비교연산자 사용 & 서브쿼리 결과 중 최소한 하나라도 만족하는 결과값 있으면 반환


(예제) SNL에 출연한 적이 있는 연예인 이름 조회

2-4. multiple row sub with All

  • 비교연산자 사용 & 서브쿼리 결과를 모두 만족하면 반환


(예제)


3. multiple column subquery

  • 연관 서브쿼리
  • 하나 이상의 열(column)을 검색하는 서브쿼리
  • WHERE절에서 사용
  • 서브쿼리 내에 메인쿼리 컬럼이 같이 사용되는 경우 : 서브쿼리만 메인쿼리의 컬럼을 사용할 수 있음

(예제) 강동원과 성별, 소속사가 같은 언예인의 이름, 성별, 소속사를 조회


실습 예제

  1. oil_price 테이블에서 셀프주유의 평균가격과 SK에너지의 가장 비싼가격을 Scalar Subquery를 사용하여 조회

  2. oil_price 테이블에서 상표별로 가장 비싼 가격과 상호를 Inline View를 사용하여 조회

  3. 평균가격 보다 높은 주유소 상호와 가격을 Nested Subquery를 사용하여 조회

  4. 3번에서 조회한 주유소에서 주유한 연예인의 이름과 주유소, 주유일을 Nested Subquery를 사용하여 조회(with refueling 테이블)

  5. refueling 테이블과 oil_price 테이블에서 10만원 이상 주유한 연예인 이름, 상호, 상표, 주유 금액, 가격을 Inline View를 사용하여 조회

0개의 댓글