다음 중 아래와 같은 테이블에서 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 |
임을 확인 했습니다.
- 원문에는 '4번이다.'라고 되어 있었는데 오타인 것 같아 수정 [본문으로]