YS's develop story
Select절에서 사용할 수 있는 서브쿼리 Scalar Subquery 본문
Select절에서 사용할 수 있는 서브 쿼리 Scalar Subquery
Scalar Subquery 특징
한 개의 single value를 반환하는 Select절의 서브 쿼리입니다.
만약 Scalar Subquery를 이용하여 한 개 보다 많은 column을 출력하고자 한다면
Runtime error가 발생하게 됩니다.
Scalar Subquery는 테이블에서 column 값을 조회할 때 불필요한 Join을 하지 않기 위해 사용됩니다.
Scalar Subquery는 해당하는 값이 존재하지 않을 경우 null을 반환합니다.
Scalar Subquery 예시
아래와 같이 두 개의 테이블이 있습니다.
Community 테이블
CommunityReply 테이블
SELECT
contentName,
(SELECT COUNT(*) FROM CommunityReply WHERE Community.contentId = CommunityReply.contentId ) AS replyCount,
createdAt
FROM Community
위와 같이 Scalar Subquery를 활용하여서
게시판의 글 제목과 글의 달린 댓글 수, 생성 시간을 한 번에 출력할 수 있습니다.
이를 하기 위해 불필요한 join필요 없이 Scalar Subquery만 활용하면 되는 것이죠.
하지만 Scalar Subquery로 한 개 보다 많은 column을 표시하고자 한다면
Operand should contain 1 column(s)라는라는 에러가 발생합니다.
어떻게 보면 당연한 에러입니다. 하지만 이런 실수를 하기도 하니 주의해서 사용하면 됩니다.
SELECT
contentName,
(SELECT content FROM CommunityReply WHERE Community.contentId = CommunityReply.contentId
AND replyId = (SELECT MAX(replyId) FROM CommunityReply where CommunityReply.contentId = Community.contentId)
) AS replyContent,
createdAt
FROM Community
위 쿼리처럼 Scalar Subquery안에 Scalar Subquery를 또 사용할 수 있습니다.
게시글의 제목과 그 게시글의 달린 댓글 중 replyId가 가장 큰 댓글을 한 개 출력하는 쿼리입니다.
Scalar Subquery의 특징처럼 달린 댓글이 없는 경우 null을 반환합니다.
SELECT
contentName,
IFNULL(
(SELECT content FROM CommunityReply WHERE Community.contentId = CommunityReply.contentId
AND replyId = (SELECT MAX(replyId) FROM CommunityReply where CommunityReply.contentId = Community.contentId)
),-1)replyContent,
createdAt
FROM Community
위 쿼리처럼 IFNULL키워드를 활용하여 Scalar Subquery의 null 값을 -1로 변경해 줄 수 있습니다.
'Database' 카테고리의 다른 글
참조 무결성 및 Cascade (0) | 2021.05.18 |
---|---|
SQL Having, Where 차이 (0) | 2021.04.28 |
SQL Aggregate Functions 집계함수, Group By 활용 (0) | 2021.04.27 |
Cartesian Product (0) | 2021.04.26 |
Super key, Candidate key, Primary key, Foreign key 비교 (3) | 2021.04.25 |