본문 바로가기
클라우드 활용 자바개발자 양성과정/02. 데이터베이스 활용

03. GROUP BY & HAVING

by moca7 2024. 7. 18.

 

ㅁ GROUP BY & HAVING

- 같은 값을 가진 데이터들을 하나의 그룹으로 묶어서 처리

- 주로 그룹 함수와 함께 사용함

 

-    SELECT   컬럼, 산술식, 함수식 , ... AS "별칭"

        FROM   테이블명

      WHERE   조건식

GROUP BY   그룹기준의 컬럼 | 함수식, ...

 

 

ㅁ 유의사항. GROUP BY절에 명시한 컬럼만 SELECT절에 작성이 가능하다. 

 

 

- 그룹함수에 인자로 주는 컬럼값 말고, 그냥 조회할 때 GROUP BY절에 명시한 컬럼만 SELECT에 작성 가능하다는 것.

 

 

 

 

 SELECT *
 FROM EMPLOYEE
 GROUP BY DEPT_CODE;

 

- 오류

 

 

- GROUP BY에 DEPT_CODE(컬럼)를 제시하면 DEPT_CODE(컬럼)값이 '일치하는' 데이터끼리 묶인다.

 

 

 

 

 

 GROUP BY절은 GROUP 함수와 함께 쓸 수 있다.

 

- 그룹함수는 그룹당 1개의 결과를 반환.

7개의 그룹이니까 7개의 결과를 반환.

 

 

그룹함수는 그룹별로 실행된다.

- GROUP BY를 쓰면 보통 그룹함수를 쓴다. 안쓰는 경우가 없다.

 

  SELECT JOB_CODE
               , COUNT(*)
               , SUM(SALARY)
               , TO_CHAR(AVG(SALARY), 'L9,999,999')
   FROM   EMPLOYEE
 GROUP  BY JOB_CODE;

 

- TO_CHAR에 작은 따옴표 써야지, 큰 따옴표 쓰면 오류남.

- 급여여서 몇백만 단위라서, 'L999,999'쓰면 오류남.

 

 

 

 

GROUP BY절에 함수식도 기술 가능하다

 

 

- GROUP BY에 SUBSTR(EMP_NO, 8, 1)를 쓰면, SUBSTR(EMP_NO, 8, 1)이 일치하는 데이터끼리 묶인다.

- GROUP BY절에 컬럼을 주면, 그 컬럼의 값이 일치하는 데이터끼리 묶이고,

GROUP BY절에 함수식을 주면, 그 함수식의 값이 일치하는 데이터끼리 묶인다.

- 예를 들어, GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')와 같이 사용하면, 입사 년도의 연도 부분을 추출하여 그 값이 동일한 행들이 하나의 그룹을 형성합니다.

 

 

- DECODE 함수 사용.

 

 

 

ㅁ 예제 (입사년도별 사원수)

 

- 입사년도별 사원수 어느 년도에 사원이 많이 입사했는지.

 

 

 

 

ㅁ GROUP BY 절에 컬럼 여러개 작성 가능

 

 

- 두개가 쌍으로 묶여서 일치하는 데이터끼리 묶임.

- 부서와 직급이 일치하는 사원들을 그룹으로 묶음.

 

 

 

 

ㅁ < HAVING 절 >

- 필수는 아니고 선택적으로 GROUP BY절과 함께 사용된다.

- 그룹함수에 대한 조건을 제시할 때 주로 사용된다.

 

-    SELECT   컬럼, 산술식, 함수식 , ... AS "별칭"

        FROM   테이블명

     WHERE   조건식

GROUP BY   그룹기준의 컬럼 | 함수식, ...

     HAVING   그룹함수식을통한조건 | 그룹칼럼을통한조건

 

 

 

ㅁ 예제 (각 부서별 평균 급여 조회)


SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE;

 

- 참고로 (null)을 포함한 7개의 행이 나옴.

 

 

ㅁ 예제 (부서별 평균급여가 300만원 이상인 부서만을 조회)

 

     SELECT    DEPT_CODE, AVG(SALARY)
        FROM    EMPLOYEE

     WHERE    AVG(SALARY) = 3000000          //         오류
GROUP BY    DEPT_CODE;


- FROM절 뒤에  WHERE 절로 AVG(SALARY) = 3000000  가능? 노노. 실행순서상.
- 그룹함수식을 가지고 WHERE절에 조건작성 불가

 

 

 

 

 

ㅁ 예제 (직급별 급여합이 1000만원 이상인 직급만을 조회)

 

 

ㅁ 예제 (부서별 보너스를 받는 사원이 없는 부서만을 조회)

 

 

 

 

ㅁ < SELECT 실행순서 >

(5)     SELECT     조회하고자하는 컬럼 AS 별칭 | 산술식 "별칭" | 함수식 AS "별칭"

(1)         FROM     조회하고자하는 테이블명

(2)      WHERE     조건식 (연산자를 가지고 기술)

(3) GROUP BY     그룹기준으로 삼을 컬럼 | 함수식

(4)      HAVING     조건식 (그룹함수를 가지고 기술)

(6) ORDER BY     컬럼 | 별칭 | 순번   [ ASC | DESC ]   [ NULLS FIRST|NULLS LAST ]

 

- ORDER BY절이 유일하게 SELECT절 다음으로 와서 별칭을 쓸 수 있다.

 

 

 

 

ㅁ 예제

 

 

ㅁ 예제

 

- 데이터베이스에서 GROUP BY 절은 기본적으로 NULL 값을 하나의 그룹으로 취급합니다.

 

 

 

ㅁ 예제

 

 

 

ㅁ 예제

 

 

 

ㅁ 예제

 

 

- 둘 다 같다.

- HAVING에 그룹함수 외의 일반 조건도 올 수 있다.

- WHERE 절이 행 단위의 조건을 필터링하는 반면에, HAVING 절은 그룹 단위의 조건을 필터링한다.

 

 

 

ㅁ 예제

 

 

 

 

- 이걸 집합연산자를 사용해서 똑같이 작성 가능.

SELECT문 3개를 기술하고 합침.

 

 

[고급 등급 사원수]
SELECT '고급', COUNT(*)
FROM EMPLOYEE
WHERE SALARY >= 5000000;

[중급 등급 사원수]
SELECT '중급', COUNT(*)
FROM EMPLOYEE
WHERE SALARY < 5000000 AND SALARY >= 3500000;

[초급 등급 사원수]
SELECT '초급', COUNT(*)
FROM EMPLOYEE
WHERE SALARY < 3500000;

 

 

 

- 첫번째, 두번째 쿼리의 세미콜론을 지우고, UNION을 작성한다. (하나의 쿼리로 묶는다)

 

 

 

 

 

 

 

ㅁ < 집합 연산자 SET OPERATION >

- 여러 개의 쿼리문을 가지고 하나의 결과물로 조회하는 연산자

 

- UNION 합집합 

- INTERSECT 교집합

- UNION ALL 합집합+교집합

- MINUS 차집합

 

 

 

ㅁ 집합 연산자 유의사항

- 각 쿼리문의 SELECT절에 작성되는 컬럼 갯수 동일

- 각 쿼리문의 SELECT절에 작성되는 컬럼 타입 동일 (EMP_ID와 EMP_NAME 간의 연산 불가)

- ORDER BY절은 마지막 쿼리에 작성해야 한다. 

 

 

ㅁ 예제

SELECT *
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'

UNION

SELECT *
FROM EMPLOYEE
WHERE SALARY > 3000000
ORDER BY EMP_ID              //             오류
;

 

- ORDER BY절은 마지막 쿼리에 작성해야 하는건 맞는데, 이렇게는 안 됨.

 

 

SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'

UNION

SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000
ORDER BY EMP_ID
;

 

- 이거는 가능.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'클라우드 활용 자바개발자 양성과정 > 02. 데이터베이스 활용' 카테고리의 다른 글

05. SUBQUERY  (0) 2024.07.19
04. JOIN (조인문)  (0) 2024.07.18
02. SELECT (함수)  (0) 2024.07.17
01. SELECT (기본 문법)  (0) 2024.07.16
0. 오라클 설치  (0) 2024.07.15