Database

Select절에서 사용할 수 있는 서브쿼리 Scalar Subquery

Yusang 2021. 4. 29. 16:41

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로 변경해 줄 수 있습니다.