데이터베이스 기초
사원 표(사원번호, 부서, 급여)에서 부서별 평균 급여가 300 이상인 부서와 그 평균 급여를 구하려고 한다. 올바른 SQL 문은?
- ASELECT 부서, AVG(급여) FROM 사원 GROUP BY 부서 HAVING AVG(급여) >= 300
- BSELECT 부서, AVG(급여) FROM 사원 WHERE AVG(급여) >= 300 GROUP BY 부서
- CSELECT 부서, AVG(급여) FROM 사원 WHERE 급여 >= 300 GROUP BY 부서
정답과 해설 보기
정답: A. SELECT 부서, AVG(급여) FROM 사원 GROUP BY 부서 HAVING AVG(급여) >= 300
SQL의 처리는 FROM의 표에서 WHERE로 행을 고르고, GROUP BY로 그룹으로 묶고, HAVING으로 그룹을 고르는 순서로 생각합니다. WHERE는 한 행씩에 대한 조건으로, 그룹으로 묶기 전에 평가되므로 AVG 같은 집계 함수는 쓸 수 없습니다. 그룹별 집계 결과에 대한 조건은 HAVING에 쓰므로 HAVING AVG(급여) >= 300이 올바른 작성법입니다. WHERE 급여 >= 300으로 하면 급여가 300 이상인 사원만 먼저 고른 뒤 평균을 내므로 '급여가 300 이상인 사원만의 평균'이라는 다른 의미가 되며, 부서 전체의 평균 급여가 300 미만인 부서도 급여가 300 이상인 사원이 한 명이라도 있으면 결과에 나옵니다.