SUB QUERY (서브쿼리)
포스트
취소

SUB QUERY (서브쿼리)

해당 포스트는 SQLD를 학습하며 정리한 내용에 대한 포스트입니다.


이론을 학습한 내용을 정리하고 퀴즈, 기출문제 등을 기록하려고 합니다.


🌈 SUB QUERY (서브쿼리)

💡 SUB QUERY의이름

1
2
3
SELECT (스칼라서브쿼리 SCALA SUBQUERY)
FROM (인라인뷰 INLINE VIEW) 
WHERE(HAVING) X = (중첩서브쿼리 NESTED SUBQUERY)

💻 MAIN QUERY와 SUB QUERY

Subquery는 SELECT문 내에 다시 SELECT문을 사용하는 SQL문이다.

Subquery의 형태는 FROM구에 SELECT문을 사용하는 인라인 뷰(Inline View)와 SELECT문에 Subquery를 사용하는 스칼라 서브쿼리(Scala Subquery)이 있다.

WHERE 또는 HAVING 에 SELECT문을 사용하면 중첩 서브쿼리(Nested Subquery)라고 한다.

메인 쿼리의 컬럼이 포함된 서브쿼리를 연관 서브쿼리, 메인 쿼리의 컬럼이 포함되지 않은 서브쿼리를 비연관 서브쿼리라고 한다.

  • 아래는 키가 177 초과되는 데이터를 출력한다.
  • 김용만의 키가 177임을 알고 있을때 할 수 있는 쿼리문이다.
  • 그러나 몰랐을 때는 어떻게 해야 할까? 이 때, 서브 쿼리를 적절히 이용하면 된다.

SUB QUERY

  • 통상적으로 사람을 기억할 때는 키가 포인트가 되는 것이 아니라, 이름을 기억한다.

SUB QUERY

  • 위의 예에 WHERE 구에 있는 SELECT문은 서브쿼리(Subquery)이고 괄호 내에 SELECT문을 사용한다.

  • 서브쿼리 밖에 있는 SELECT문은 메인쿼리(Main Query)이다,

image

  • FROM구에 SELECT문을 사용하여 가상의 테이블을 만드는 효과를 얻을 수 있다.

  • 이렇게 FROM구에 SELECT문을 사용한 것이 인라인 뷰(inline View)이다.


💻 SCALA SUBQUERY(스칼라 서브쿼리)

주로 SELECT 절에 위치하지만 컬럼이 올 수 있는 대부분에 위치에 사용가능

스칼라 Subquery는 반드시 한 행과 한 컬럼만 반환하는 서브쿼리이다.

만약 여러 행이 반환되면 오류가 발생한다.

image

  • 앞의 예처럼 직원 급여를 조회할 때 평균급여를 같이 계산하여 조회한다.

  • 스칼라 SUBQUERY를 사용해서 직원의 평균급여를 함께 계산한 것이다.


💻 INLINE VIEW (인라인 뷰)

  • 인라인뷰는 FROM절 등 테이블명이 올 수 있는 위치에 사용가능
1
2
3
4
5
6
7
8
9
10
11
SELECT M.PRO_CODE,
       S.PRO_NAME,
       S.PRICE,
       M.MEMBER_ID
       M.CONTENT
  FROM PRO_REVIEW M,
      `(SELECT PRO_CODE,
              PRO_NAME,
              PRICE,
        FROM PRODUCT) S`
WHERE M.PRO_CODE = S.PRO_CODE


💻 NESTED SUBQUERY (중첩 서브쿼리)

  • WHERE절과 HAVING절에서 사용가능

메인 쿼리와의 관계에 따라 다음과 같이 나눌 수 있다.

  
비연관 서브쿼리
(Uncooreleated Subquery)
메인 쿼리와 관계를 맺고 있지 않음
연관 서브쿼리
(Corelated Subquery)
메인 쿼리와 관계를 맺고 있음

비연관 서브쿼리 (Uncooreleated Subquery) : 서브 쿼리 내에 메인 쿼리의 컬럼이 존재하지 않음

연관 서브쿼리 (Corelated Subquery) :서브 쿼리 내에 메인 쿼리의 컬럼이 존재

연관 Subquery


서브쿼리 종류(반환 행)

서브쿼리(Subquery)는 반환하는 행 수가 한 개인 것과 여러 개인 것에 따라서 단일 행 서브쿼리와 멀티 행 서브쿼리로 분류된다.

다중 컬럼의 데이터를 반환할 경우 다중 컬럼 서브쿼리라 한다.

서브쿼리 종류설명
단일 행 서브쿼리- 서브쿼리를 실행하면 그 결과는 반드시 한 행만 조회된다.
- 비교 연산자인 =, <, <=, >, >=, <>를 사용한다.
다중 행 서브쿼리- 서브쿼리를 실행하면 그 결과는 여러 개의 행이 조회된다.
- 다중 행 비교 연산자인 IN, ANY, ALL, EXISTS를 사용한다.
다중 컬럼 서브쿼리- 서브쿼리가 여러 컬럼의 데이터를 반환

단일 행 Subquery

단일 행 서브쿼리는 단 하나의 행만 반환하는 서브쿼리로 비교 연산자(=, <, <=, >=, <=)를 사용한다.

다중 행 Subquery

다중 행 서브쿼리는 서브쿼리 결과가 여러 개의 행을 반환하는 것으로 다중 행 연산자(IN, ANY, ALL,EXISTS)를 사용해야 한다.

다중 행 연산설명
IN- Main query의 비교조건이 Subqueary의 결과 중 하나만 동일하면 참이 된다(OR조건).
ALL- Main query와 Subquery의 결과가 모두 동일하면 참이 된다.
- < ALL: 최솟값을 반환한다.
- > ALL: 최댓값을 반환한다.
ANY- Main query의 비교조건이 Subquery의 결과 중 하나 이상 동일하면 참이 된다.
- < ANY: 하나라도 크게 되면 참이 된다.
- > ANY: 하나라도 작게 되면 참이 된다.
EXISTS- Main query와 Subquery의 결과가 하나라도 존재하면 참이 된다.

ANY

ANY

  • 위의 쿼리문을 실행해보면 에러가 발생한다.

  • 그 이유는 반드시 비교대상이 숫자 1개의 값이 나와야 되는데 서브쿼리를 따로 실행해보면 2개가 나오는 것을 알 수 있다.

  • 비교대상의 모호성이 발생되면서 문법이 맞지 않는 것이다.

  • 예시 코드 서브쿼리 앞에 ANY를 붙였다.

  • 서브쿼리 별과값이 170, 173이었다.

  • 서브 쿼리 앞에 ANY의 의미는 OR의 개념과 비슷하다.

  • 170이거나 173이다. 즉 다시 말해 170이상인 데이터를 다 출력하겠다 라는 의미가 되는 것이다.

  • 기억할 것은 서브쿼리가 반환하는 값이 키(Height)라는 것이다.

ANY SUBQUERY

  • ANY와 동일한 역할을 하는것으로 SOME도 존재한다.

ANY와 동일한 역할을 하는것으로 SOME도 존재

  • 부등호를 =을 바꾸게 되면 170, 173과 똑같은 결과값을 리턴해준다.

ALL

ALL은 서브쿼리의 결과값 둘 다 만족하는 데이터만 출력한다.

즉, AND의 개념과 유사하다.

image

  • 즉, 170, 173을 만족하는 값은 173인 것이다.

IN

IN은 MAIN QUERY의 비교조건이 SUBQUERY의 결과 중 하나만 동일하면 참이된다. (OR조건과 유사)

IN은 반환되는 여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산이다.

IN

EXISTS

  • EXISTS는 SUBQUERY로 어떤 데이터 존재 여부를 확인하는 것이다

  • 즉, EXISTS의 결과는 참과 거짓인 BOOLEAN 값이 반환된다

첫 번째 SELECT문의 결과를 토대로 하여 WHERE EXISTS의 SELECT를 비교해서 맞는 행이 존재한다면 출력하는 것이다.

  • DISTINCT와 비슷한 역할을 한다.

EXISTS


🎯 추가 내용


📚 레퍼런스

정미나. (유튜브 선생님에게 배우는) 유선배 SQL개발자(SQLD) 과외노트 / [정미나 저] (2023). Print.

한국데이터산업진흥원. SQL 자격검정 실전문제 : 국가공인 SQL전문가·국가공인 SQL개발자 / 한국데이터산업진흥원 [편] (2020). Print.

SQL 개발자 (SQLD) 자격증 따기 Part.2 / [유용한IT학습]

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.