데이터베이스 기초

사원 표(사원번호, 부서, 급여)에서 부서별 평균 급여가 300 이상인 부서와 그 평균 급여를 구하려고 한다. 올바른 SQL 문은?

  1. ASELECT 부서, AVG(급여) FROM 사원 GROUP BY 부서 HAVING AVG(급여) >= 300
  2. BSELECT 부서, AVG(급여) FROM 사원 WHERE AVG(급여) >= 300 GROUP BY 부서
  3. 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 이상인 사원이 한 명이라도 있으면 결과에 나옵니다.

이 분야 연습하기 분야로 돌아가기

데이터베이스 기초의 다른 문제

  1. 매출 표(매장, 금액)에 (A, 500), (A, 700), (B, 300), (B, 400), (C, 1200), (D, 200), (D, 900)의 7개 행이 있다. SELECT 매장, SUM(금액) FROM 매출 GROUP BY 매장 HAVING SUM(금액) >= 1000의 결과는 몇 행이 되는가?
  2. 사원 표(이름, 부서, 급여)에 8개 행이 있고, 부서별 급여는 영업이 320, 280, 350, 개발이 400, 310, 총무가 260, 300, 기획이 330이다. SELECT 부서, COUNT(*) FROM 사원 WHERE 급여 >= 300 GROUP BY 부서 HAVING COUNT(*) >= 2의 결과는 몇 행이 되는가?
  3. 사원 표(사원번호, 이름, 부서ID)에 4개 행이 있고, 부서ID는 차례로 10, 20, 10, NULL이다. 부서 표(부서ID, 부서명)에는 부서ID가 10, 20, 30인 3개 행이 있다. SELECT 사원.이름, 부서.부서명 FROM 사원 INNER JOIN 부서 ON 사원.부서ID = 부서.부서ID의 결과는 몇 행이 되는가?
  4. 사원 표(사원번호, 이름, 부서ID)에 5개 행이 있고, 부서ID는 차례로 10, 20, 10, NULL, NULL이다. 부서 표(부서ID, 부서명)에는 부서ID가 10, 20, 30인 3개 행이 있다. SELECT 부서.부서명, 사원.이름 FROM 부서 LEFT OUTER JOIN 사원 ON 부서.부서ID = 사원.부서ID의 결과는 몇 행이 되는가?
  5. 표 R의 열 x의 값은 1, 1, 2, 3의 4개 행, 표 S의 열 x의 값은 1, 1, 2, 4의 4개 행이다. SELECT * FROM R INNER JOIN S ON R.x = S.x의 결과는 몇 행이 되는가?