문제
다음 중 '대출' 테이블(회원번호, 도서번호, 대출일)에서 대출 건수가 3건 이상인 회원에 대해 회원번호와 대출 건수를 표시하는 SQL문으로 옳은 것은?
① SELECT 회원번호, COUNT() FROM 대출 WHERE COUNT() >= 3 GROUP BY 회원번호; ② SELECT 회원번호, SUM() FROM 대출 GROUP BY 회원번호 WHERE COUNT() >= 3; ③ SELECT 회원번호, COUNT() FROM 대출 GROUP BY 회원번호 HAVING COUNT() >= 3; ④ SELECT 회원번호, COUNT() FROM 대출 HAVING COUNT() >= 3 GROUP BY 회원번호;
정답
3번
해설
정답: 3. 그룹별 집계 결과에 조건을 거는 절은 HAVING이며, GROUP BY 뒤에 와야 한다. 회원번호로 그룹을 묶고 그룹별 개수가 3 이상인 경우만 표시하므로 GROUP BY 회원번호 HAVING COUNT(*) >= 3 이 옳다.
오답 풀이
- 1번: 집계 함수 조건을 WHERE에 쓸 수 없으므로 틀리다.
- 2번: SUM(*) 표기가 잘못되었고 WHERE 위치도 틀리다.
- 3번: GROUP BY 다음에 HAVING으로 집계 조건을 지정하므로 옳다.
- 4번: HAVING이 GROUP BY보다 앞에 와서 구문 순서가 틀리다.
보충 개념 SQL 절 순서는 SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY이며, 그룹 집계 조건은 HAVING에 쓴다.