출처: 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절로 검색조건을 줄 수 있습니다.
오늘은 여기까지!
주말엔 쉽니다~ 월요일에 다시 만나요 우리~
'SQL' 카테고리의 다른 글
ORACLE | JOIN을 사용하는 오라클만의 방법! (0) | 2018.04.03 |
---|---|
ORACLE | 분석함수 RANK & DENSE_RANK , PIVOT& UNPIVOT (0) | 2018.04.02 |
ORACLE | 날짜타입 형변환하기! (2) | 2018.03.29 |
ORACLE | SQL 문자함수(INSTR, REGEXP_REPLACE, TRIM) (0) | 2018.03.28 |
ORACLE | 기타 비교연산자 LIKE와 와일드 카드 + ESCAPE (1) | 2018.03.27 |