[SQLD 퀴즈] GROUP BY를 사용한 조회결과

다음 중 아래와 같은 테이블에서 SQL의 실행 결과로 가장 적절한 것은?

 

-------------------------------------  아       래 ---------------------------------------

 

[계약]

주문번호

주문일자

주문금액

부가세

주문월

101

2010/01/01

500

50

201001

 

SELECT COUNT(*) CNT, SUM(주문금액) 주문금액

FROM 계약

WHERE 주문월 = ‘201010’

GROUP BY 주문월

 

------------------------------------------------------------------------------------------

 

CNT

주문금액

0

0

CNT

주문금액

0

CNT

주문금액

0

CNT

주문금액

(데이터가 존재하지 않음)

 

 

[출처] http://www.dbguide.net/da.db?cmd=snb9_4_view&boardUid=165374&boardConfigUid=81

 

 

정답 : 


주어진 조건을 만족하는 건이 없다. 만약 SQL에서 GROUP BY절을 사용하지 않았다면 2번이 정답이다.[각주:1]

 

 

사람들의 반응이 2번과 4번 두 개로 나누어져 있는 문제

 

1) 4번이다.

 

그룹함수가 단독으로 쓰일 경우는 null 이 되던 0 되던 무조건 결과 row를 반환 하지만 위와같이 그룹절에 컬럼을 명시하였는데 결과값이 없는 경우라면 아무런 row를 반환하지 못함.

 

group by를 사용하지 않으면 count(*)가 0으로 표시되지만 그룹함수인 group by를 사용하여 null을 리턴합니다.

 

2) 아니다. 2번이다.

 

그룹함수의 경우는 결과가 없는 경우에 0 을 리턴해주고, 다른 컬럼은 공집합을 반환하기때문입니다.

 

실행순서가 From절 ->Where 절 ->Group By절->Select절 인데 Where절에서 만족하는 행이 하나도 없기 때문에 빈 테이블이라고 간주해도 됩니다.Group By절에서 아무 영향을 못끼치고 Select절에서 COUNT(*) 는 행의 수를 반환하는데 해당하는 행이 0개 이기 때문에 0을 반환하고 집계함수 Sum(주문금액)은 null을 제외한 행들의 합을 구하게 되는데 해당하는 행이 하나도 없기 때문에 데이터가 존재하지 않게됩니다.

 

 

 

직접 실행해 본 결과

 

SELECT COUNT(*) CNT, SUM(주문금액) 주문금액

FROM 계약

WHERE 주문월 = ‘201010’

GROUP BY 주문월

 

인 경우가 ④ 번

 

CNT

주문금액

(데이터가 존재하지 않음)

 

 

 

SELECT COUNT(*) CNT, SUM(주문금액) 주문금액

FROM 계약

WHERE 주문월 = ‘201010’

 

인 경우가 ② 번

 

CNT

주문금액

0

 

임을 확인 했습니다.

  1. 원문에는 '4번이다.'라고 되어 있었는데 오타인 것 같아 수정 [본문으로]