반응형

출처: https://www.gettyimages.com



그룹함수란 무엇일까요?



그룹함수는 여러 개의 행 데이터를 집합 연산을 수행하여


하나의 결과로 출력하는 함수입니다!





 1. MAX: 최대값을 출력하는 함수


 2. MIN: 최소값을 출력하는 함수


 3. SUM: 총합을 구하는 함수


 4. AGE: 평균값을 구하는 함수


 5. COUNT: 테이블의 행의 수를 세는 함수


 이외에 STDDEV, VARIANCE 함수도 포함합니다.



위의 함수는 모두 복수행 함수(그룹함수)입니다.


복수행 함수의 특징을 2가지를 살펴보겠습니다.



우선, 설명을 원활히 하기 위해 아래와 같이 EMP 테이블이 있다고 가정하겠습니다.


사원명

나이

직업

연봉 

보너스

 A

 35

  NULL

 NULL

 

 B

 34

  SALESMAN

 1600

 300

 C

 38

  PRESIDENT

 5000

 

 D

 36

  SALESMAN

 1400

 0

 E

 39

  ANALYST

 3000

 

 F

 32

  SALESMAN

 1350

 500

 G

 37

  MANAGER

 2850

 

 H

 35

  ANALYST

 3000

 

 I

 36

  SALESMAN

 1700

 1400




첫번째 특징, NULL 값을 무시합니다.



문제1. 전체 직업의 평균 연봉을 알고싶다.


 SELECT avg( 연봉 )

FROM emp;


결과a. 1600 + 5000 + 1400 + 3000 + 1350 + 2850 + 3000 + 1700 / 8


결과b. 1600 + 5000 + 1400 + 3000 + 1350 + 2850 + 3000 + 1700 / 9




그렇다면 결과 b처럼 연봉컬럼에서 null값을 가진 A도 포함하여 계산하고 싶다면 어떻게 해야할까요?



바로 이때 사용할 수 있는 함수는


 NVL, NVL2, COALESCE, CASE, DECODE 함수 사용할 수 있습니다.


저는 NVL함수를 이용하여


결과b처럼 전체 사원 수로 출력되도록 SQL문을 작성해보겠습니다.



  SELECT avg( nvl ( 연봉, 0 ) )

FROM emp;



nvl 함수를 이용하면 null 값을 0 대신하여 출력할 수 있습니다.


따라서 결과는 0 + 1600 + 5000 + 1400 + 3000 + 1350 + 2850 + 3000 + 1700 / 9 로 출력됩니다.




문제2. 아래의 두 SQL의 결과는 같을까? 다를까?


SQL1> SELECT sum( 보너스 ) from emp;


SQL2> ELECT sum( nvl( 보너스, 0) ) from emp;





하지만 현재 emp 테이블에서


null 값이 많이 들어있는 보너스와 같은 컬럼의 경우 


두번째 SQL 문과 같이 null 값을 0 으로 바꾸어 계산한다면


속도면에서 성능이 떨어지게 되겠죠?



결국 SQL의 성능을 생각한다면


첫 번째 SQL과 같이 SQL을 작성해야합니다!




두번째 특징, 각각은 GROUP BY절과 함께 사용할 수 있습니다.



문제1. 직업이 SALESMAN인 사원들 중에서 최대 월급을 알고싶습니다.




WHERE 절은 데이터 검색 조건을 기술하는 절입니다.


따라서 위의 경우 직업이 SALESMAN 인 사원들을 의미합니다.



결론적으로 위의 SQL을 해석하면


① 직업이 SALESMAN인 사원들을 검색 조건으로,

즉 직업이 SALESMAN인 사원만을 선택하여


② 최대값을 구하는 함수를 사용하여 최대 월급을 구하는 것입니다.




문제2. 직업과 직업별 최대 연봉을 알고 싶습니다.




GROUP BY절의 역할은 직업 data를 그룹핑하는 것입니다.


따라서 직업별로 어떠한 값을 구하고자 할 때는 GROUP BY 함수를 이용하여 구할 수 있습니다.



여기서 잠깐!


GROUP BY절에서 조건을 기술할 수 있는 절은 무엇일까요?


 a. WHERE절


 b. HAVING절





그 이유는 실행 순서와 관련이 있습니다.



이해를 위한 추가문제! 아래의 SQL의 실행순서는 어떻게 될까요?


 

 ⓐ SELECT절


 ⓑ FROM절


 ⓒ WHERE절


 ⓓ GROUP BY절


 ⓔ HAVING절


 ⓕ ORDER BY절

 


참고) 위의 순서는 코드순서입니다.

 




추가문제를 통해 알 수 있듯


GROUP BY절은 WHERE절 이후에 실행됩니다.


즉, WHERE절에서 실행되는 순간에는  GROUP BY를 통한 데이터 그룹핑은 일어나지 않습니다.



따라서 GROUP BY를 통한 결과값을 갖는 그룹함수는 HAVING절로 검색조건을 줄 수 있습니다.



오늘은 여기까지!


주말엔 쉽니다~ 월요일에 다시 만나요 우리~




반응형

+ Recent posts