데이터베이스 기초

사원 표(이름, 부서, 급여)에 8개 행이 있고, 부서별 급여는 영업이 320, 280, 350, 개발이 400, 310, 총무가 260, 300, 기획이 330이다. SELECT 부서, COUNT(*) FROM 사원 WHERE 급여 >= 300 GROUP BY 부서 HAVING COUNT(*) >= 2의 결과는 몇 행이 되는가?

  1. A2행
  2. B3행
  3. C4행
정답과 해설 보기

정답: A. 2행

먼저 WHERE로 급여가 300 이상인 행만 남깁니다. 영업은 320과 350의 2행, 개발은 400과 310의 2행, 총무는 300의 1행, 기획은 330의 1행이 남고, 영업의 280과 총무의 260은 제외됩니다. 다음으로 GROUP BY로 부서별로 묶으면 4개 그룹이 되며, 각각의 행 수는 영업 2, 개발 2, 총무 1, 기획 1입니다. 마지막으로 HAVING COUNT(*) >= 2로 행 수가 2 이상인 그룹만 남기므로 영업과 개발의 2행이 결과가 됩니다. WHERE를 붙이지 않고 세면 영업 3, 개발 2, 총무 2, 기획 1이 되어 HAVING을 만족하는 것은 3행입니다. WHERE는 그룹화 전, HAVING은 그룹화 후에 작용한다는 순서가 결과를 좌우합니다.

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

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

  1. 사원 표(사원번호, 이름, 부서ID)에 4개 행이 있고, 부서ID는 차례로 10, 20, 10, NULL이다. 부서 표(부서ID, 부서명)에는 부서ID가 10, 20, 30인 3개 행이 있다. SELECT 사원.이름, 부서.부서명 FROM 사원 INNER JOIN 부서 ON 사원.부서ID = 부서.부서ID의 결과는 몇 행이 되는가?
  2. 사원 표(사원번호, 이름, 부서ID)에 5개 행이 있고, 부서ID는 차례로 10, 20, 10, NULL, NULL이다. 부서 표(부서ID, 부서명)에는 부서ID가 10, 20, 30인 3개 행이 있다. SELECT 부서.부서명, 사원.이름 FROM 부서 LEFT OUTER JOIN 사원 ON 부서.부서ID = 사원.부서ID의 결과는 몇 행이 되는가?
  3. 표 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의 결과는 몇 행이 되는가?
  4. 고객 표(고객ID, 이름)에는 (C1, 아오키), (C2, 이노우에), (C3, 우에다), (C4, 에토)의 4개 행이 있다. 주문 표(주문ID, 고객ID, 금액)에는 (O1, C1, 3000), (O2, C2, 8000), (O3, C1, 6000), (O4, C3, 2000), (O5, C2, 9000)의 5개 행이 있다. SELECT 이름 FROM 고객 WHERE 고객ID IN (SELECT 고객ID FROM 주문 WHERE 금액 > 5000)의 결과는 몇 행이 되는가?
  5. 고객 표(고객ID, 이름)와 주문 표(주문ID, 고객ID, 금액)에서 한 번도 주문하지 않은 고객의 이름을 구하려고 한다. 올바른 SQL 문은?