011. 집계 함수 - GROUP BY와 HAVING

IRISH·2024년 3월 4일
0

Oracle

목록 보기
13/17
post-thumbnail
  • 학습일자 : 2024.03.04
  • 오라클 HR 계정의 EMPLOYEES 테이블을 사용했습니다.

GROUP BY절

  • GROUP BY 절은 데이터들을 원하는 그룹으로 나눌 수 있다.
  • 나누고자 하는 그룹의 컬럼명을 SELECT절과 GROUP BY절 뒤에 추가하면 된다.
  • 집계함수와 함께 사용되는 상수는 GROUP BY 절에 추가하지 않아도 된다.
  • GROUP BY 절은 집계 함수 없이도 사용 될 수 있다.(DISTINCT와 용도가 비슷해 짐)

⇒ 예제1

  • 부서별 사원수 조회
SELECT  DEPARTMENT_ID AS "부서", COUNT(EMPLOYEE_ID) "부서별 인원수"
  FROM  EMPLOYEES
 GROUP  BY DEPARTMENT_ID
 ORDER  BY DEPARTMENT_ID ASC;

⇒ 예제2

  • 부서별로 그룹하여 부서번호, 인원수, 급여의 평균, 급여의 합을 조회
SELECT  DEPARTMENT_ID AS "부서번호"
		    ,COUNT(EMPLOYEE_ID) "인원수"
		    ,AVG(SALARY) "급여 평균"
		    ,SUM(SALARY) "급여 합"
  FROM  EMPLOYEES
 GROUP  BY DEPARTMENT_ID
 ORDER  BY DEPARTMENT_ID ASC;

⇒ 예제3

  • 업무별로 그룹하여 업무, 인원수, 평균 급여액, 최고 급여액, 최저 급여액 및 합계를 조회하는 예제
SELECT  JOB_ID				"업무"	
		    ,COUNT(EMPLOYEE_ID)	"인원수"
		    ,AVG(SALARY)		"평균 급여액"	
		    ,MAX(SALARY)		"최고 급여액"	
		    ,MIN(SALARY)		"최저 급여액"	
		    ,SUM(SALARY)		"금여 합계"
  FROM  EMPLOYEES
 GROUP  BY JOB_ID
 ORDER  BY JOB_ID ASC;

DISTINCT와 GROUP BY절

  • DISTINCT는 주로 UNIQUE(중복을 제거)한 컬럼이나 레코드를 조회하는 경우 사용한다.
  • GROUP BY는 데이터를 그룹핑해서 그 결과를 가져오는 경우 사용한다.
  • 집계함수를 사용하여 특정 그룹으로 구분 할 때는GROUP BY 절을 사용하며, 특정 그룹 구분없이 중복된 데이터를 제거할 경우에는 DISTINCT 절을 사용 하도록 하자.
  • 두 기능 모두 Oracle9i까지는 sort를 이용하여 데이터를 만들었지만, Oracle10g 부터는 모두 Hash를 이용하여 처리한다.

HAVING 절

  • WHERE 절에서는 집계함수를 사용 할 수 없다.
  • HAVING 절은 집계함수를 가지고 조건비교를 할 때 사용한다.
  • HAVING절은 GROUP BY절과 함께 사용이 된다.

⇒ 예제1

  • 사원수가 다섯 명이 넘는 부서와 사원수를 조회
SELECT  DEPARTMENT_ID		"부서"
		    ,COUNT(EMPLOYEE_ID)	"사원수"
  FROM  EMPLOYEES
 GROUP  BY DEPARTMENT_ID
HAVING  COUNT(EMPLOYEE_ID) >= 5
 ORDER  BY DEPARTMENT_ID ASC;

⇒ 예제2

  • 전체 월급이 5000을 초과하는 JOB에 대해서 JOB과 월급여 합계를 조회 // 단 판매원(SH_CLERK)은 제외하고 월 급여 합계로 내림차순 정렬
SELECT  JOB_ID			   "직무"
		    ,SUM(SALARY)	"월급여 합계"
  FROM  EMPLOYEES
 WHERE  JOB_ID != 'ST_CLERK'
 GROUP  BY JOB_ID
HAVING  SUM(SALARY) >= 5000
 ORDER  BY SUM(SALARY) DESC;

참고 URL

느낀점

SQL 관련 코딩 테스트 준비를 할 때부터 GROUP BY절과 HAVING절을 많이 사용해봐서 어려운 개념은 아니었다. 오랜만에 새로운 것이 아닌 기존에 알던 것을 공부하게 되다 보니 자신감이 생겼던 것 같다.

그래도 좋았던 점은, 코테 때보다 지금이 쿼리 실력이 올라갔다는 것? 코테 당시에는 GROUP BY에 무엇을 쓰고, HAVING에서는 어떤 것을 써야 하는지 한 5~10분 정도 시간이 걸렸었다. 하지만, 지금은 1분도 채 안되서 어느 절에 어떤 것을 써야 하는지 알고 있다!

profile
#Software Engineer #IRISH

0개의 댓글

관련 채용 정보