YS's develop story

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

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

'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
Comments