hr.hr_cate 테이블에는 부서 정보(Department), 교육 분야(EducationField) 등 속성 정보가 있고, hr.hr_number 테이블에는 직원 번호(EmployeeNumber) 등이 있을 수 있습니다.COUNT(*), SUM(), AVG() 등 집계 함수를 적용해 결과를 뽑아냅니다.GROUP BY Department, EducationField → “(부서, 교육분야)” 조합으로 데이터를 묶고, 그 안에 속한 인원수를 계산.다음은 hr.hr_cate 테이블을 LEFT JOIN하여 hr.hr_number 테이블과 합친 뒤,
(부서, 교육분야) 조합별로 인원수를 세어보는 쿼리입니다:
sql
코드 복사
SELECT
Department,
EducationField,
COUNT(*) AS hc
FROM hr.hr_cate hc
LEFT JOIN hr.hr_number hn
ON hc.EmployeeNumber = hn.EmployeeNumber
GROUP BY 1,2; -- 또는 GROUP BY Department, EducationField
COUNT(*) AS hc : 각 그룹(부서, 교육분야)에 해당하는 행의 개수를 hc라는 별칭으로 표시.GROUP BY 1,2 : SELECT 절의 첫 번째 컬럼과 두 번째 컬럼(Department, EducationField)에 대해 그룹핑한다는 의미. (DBMS마다 문법 지원 여부가 다를 수 있으나, MySQL에서는 가능)hr.hr_cate(왼쪽 테이블)에 해당하는 레코드는 전부 가져오되, 오른쪽 hr.hr_number와 연결되지 않는 경우 NULL이 될 수 있음.결과
Department와 EducationField 조합별로 몇 명이 있는지 집계된 결과가 나온다.집계 결과에서 가장 인원이 많은 상위 5개 (Department, EducationField) 조합을 보고 싶다면,
다음과 같이 ORDER BY와 LIMIT를 추가합니다:
sql
코드 복사
SELECT
Department,
EducationField,
COUNT(*) AS hc
FROM hr.hr_cate hc
LEFT JOIN hr.hr_number hn
ON hc.EmployeeNumber = hn.EmployeeNumber
GROUP BY 1,2
ORDER BY 3 DESC
LIMIT 5;
ORDER BY 3 DESC : SELECT 절의 세 번째 컬럼(hc)에 대해 내림차순 정렬LIMIT 5 : 상위 5건만 가져오기이렇게 하면 “인원이 가장 많은 (부서, 교육분야) 조합 TOP 5”가 조회됩니다.
예) 부서-교육분야 그룹별 인원이 30명 이하인 그룹만 보고 싶다면:
sql
코드 복사
SELECT
Department,
EducationField,
COUNT(*) AS hc
FROM hr.hr_cate hc
LEFT JOIN hr.hr_number hn
ON hc.EmployeeNumber = hn.EmployeeNumber
GROUP BY 1,2
HAVING hc <= 30 -- 집계된 결과(hc)가 30 이하인 그룹만 필터링
ORDER BY hc DESC;
HAVING hc <= 30 : 집계 결과(hc)가 30 이하인 그룹만 남김ORDER BY hc DESC : 인원수가 많은 순(내림차순)으로 보여주기COUNT, SUM, AVG, etc.)가 아닌 칼럼들은 GROUP BY에 반드시 포함되어야 합니다.SELECT Department, EducationField, COUNT(*) → GROUP BY Department, EducationFieldCOUNT(*) AS hc처럼 집계 함수 결과에 별칭을 주면 ORDER BY나 HAVING에서 간편하게 사용할 수 있음.ORDER BY 3 또는 ORDER BY hc와 같은 표현 지원 여부가 다를 수 있으니 주의.ROWNUM, FETCH FIRST n ROWS 등을 사용.이처럼 부서-교육분야별 인원수를 집계하고, 상위 5개를 구하거나 30명 이하만 필터링하는 등의 쿼리 방법은
데이터 분석과 리포팅에서도 자주 활용하므로 꼭 익혀두면 좋습니다.