본문 바로가기
Programming/SQL

[TIL 0627] SUBQUERY (스칼라 서브쿼리)

by 용스토리랜드 2024. 6. 27.

SUBQUERY 란 질의 안에 질의가 있는 구조로 계속해서 중첩해서 사용할 수 있다는 특징이 있습니다. 

기본적으로 SELECT와 FROM이 함께 작성되고, SUBQUERY를 통해 반환된 값 혹은 (행, 열, 테이블)을 다시 한 번 바깥에 있는 쿼리(주 쿼리)를 실행하기 위해서 사용합니다. 

 

SUBQUERY 의 위치는

1. SELECT 

2. FROM

3. WHERE  

어디든 사용가능한데, 오늘은 SELECT절에 사용될 때에 대한 글입니다.

 

SELECT 절에 사용될 때 Scalar Subquery 라고 하는데, 그 이유는 "Scalar" 라는 용어는 단일 값을 나타내는 수학적 개념에서 유래된 말로, Scalar Subquery 가 단일 행 (single row) 과 단일 열(single column)을 반환하기 때문에 이렇게 명명되었습니다.

 


저는 Query 혹은 Code 를 하나씩 뜯어 보며 이해하는 것을 좋아하는데요, 이 Query 는 Select Sub Query 실습을 하던 중 궁금한 점이 생겼던 사례를 가져왔습니다.

SELECT 
    이름,
    나이,
    (SELECT COUNT(*) 
     FROM sparta_base.theglory2 
     WHERE sparta_base.theglory2.이름 = theglory.이름) AS same_name_cnt,
    (SELECT SUM(결제금액) 
     FROM sparta_base.theglory2 
     WHERE sparta_base.theglory2.이름 = theglory.이름) AS same_name_sumamount
FROM 
    sparta_base.theglory;

 

  • 첫 번째 서브쿼리 (same_name_cnt)
    • SELECT COUNT(*) FROM sparta_base.theglory2 WHERE sparta_base.theglory2.이름 = theglory.이름
    • 이 서브쿼리는 sparta_base.theglory2 테이블에서 이름이 메인 쿼리의 theglory 테이블의 이름과 같은 행의 개수를 셉니다.
    • 예를 들어, 만약 theglory 테이블에 "홍길동"이라는 이름이 있는 행이 있다면, theglory2 테이블에서 "홍길동"이라는 이름을 가진 행의 개수를 셉니다.
    • 이 값은 same_name_cnt로 반환됩니다.
  • 두 번째 서브쿼리 (same_name_sumamount)
    • SELECT SUM(결제금액) FROM sparta_base.theglory2 WHERE sparta_base.theglory2.이름 = theglory.이름
    • 이 서브쿼리는 sparta_base.theglory2 테이블에서 이름이 메인 쿼리의 theglory 테이블의 이름과 같은 모든 행의 결제금액을 합산합니다.
    • 예를 들어, 만약 theglory 테이블에 "홍길동"이라는 이름이 있는 행이 있다면, theglory2 테이블에서 "홍길동"이라는 이름을 가진 행의 결제금액을 모두 더합니다.
    • 이 값은 same_name_sumamount로 반환됩니다.

 

select count(*) 
from sparta_base.theglory2 
where sparta_base.theglory2.이름=theglory.이름

 

하지만, 이렇게 Sub Query 만 따로 빼서 실행을 했을 때는 오류가 났습니다. 

 

Why?

왜냐 하면, 현재 subquery 문에는 참조하고 있는 테이블이 theglory 2 테이블 밖에 없기 때문에 WHERE 절에서 theglory.이름을 조회할 수가 없습니다.

 

하지만, 전체 Query 에서는 마지막 줄에 from spart_base.theglory 가 작성되어 있기 때문에 theglory 테이블을 참조할 수 있습니다. 

 

이렇게, 전체 Subquery 는 단일 Query 로는 실행이 가능할 때가 있고, 아닐 때가 있음을 알게되었고, 여러분도 이 점을 유의해서 앞으로 Query 를 작성하시길 바랍니다 !

반응형