
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 를 작성하시길 바랍니다 !
'Programming > SQL' 카테고리의 다른 글
[TIL 0628] SQL 세션 과제 수행 [기록용] (0) | 2024.06.28 |
---|---|
[TIL 0628] 루시와 엘라 못 찾을 뻔한 썰 (0) | 2024.06.28 |
[TIL 0626] GROUP BY 와 HAVING (0) | 2024.06.26 |
[TIL 0626][SQL] MySQL 쿼리를 작성할 때 따옴표를 붙여줘야 하는 경우 (0) | 2024.06.26 |
[프로그래머스 SQL] 동명 동물 수 찾기 (0) | 2024.06.26 |