여러행함수 : 그룹함수

여러행함수 : 그룹함수

SQL함수에는 두가지 유형이 있다.

  1. 단일행함수 : 행당 하나의 결과 반환
  2. 여러행함수 : 행 집합당 하나의 결과 반환
    1. 그룹함수
    2. Group by절
    3. Having절

이 중 여러행함수에 대해 알아보자.
그룹함수는 테이블의 전체 행을 하나 이상의 컬럼을 기준으로 그룹화하여 그룹별로 결과를 출력하는 함수

그룹함수

  • 그룹함수의 특징
    • null값빼고 연산된다.
    • select절의 컬럼리스트들 중 그룹함수에 포함된 컬럼과 그룹함수에 포함되지 않은 컬럼을 같이 출력하려면 포함되지 않은 컬럼은 반드시 group by절에 적어야한다!

http://www.dbguide.net/db.db?cmd=view&boardUid=148195&boardConfigUid=9&categoryUid=216&boardIdx=134&boardStep=1




숫자뿐만 아니라 날짜,문자에도 max(),min()가 가능하다

날짜에서 min값은 더 과거날짜를 말한다.
날짜에서 max값은 더 최신날짜를 말한다.
문자열에서 min값은 알파벳순으로 A로 시작하는 값을 말한다.
문자열에서 max값은 알파벳역순으로 Z로 시작하는 값을 말한다.




avg(), max(), min(), sum()예시

employees테이블에 있는 모든 사원의 연봉의 평균값과, 최대값, 최소값, 합계를 구하는 쿼리이다.
모든 값들에서 null값 제외된다.

1
2
$ select avg(salary), max(salary), min(salary), sum(salary)
$ from employees

employees테이블의 모든 사원들의 커미션 평균을 구하는 쿼리구문을 작성해보자
두 가지 방법이 있는데 어느 것이 정답일까?

1
2
3
4
5
6
7
8
9
//1. avg()사용
select avg(commssion_pct) as "Avg_comm1"
from employees
//출력값 : .222857143

//2. sum(), count()사용
select sum(commssion_pct)/count(last_name) as "Avg_comm2"
from employees
//출력값 : .072897196

정답은 2번이다.
WHY?
null값때문에!

avg()같은 경우 제외된 null행의 갯수가 분모에 들어갈까?
nope! 포함되지 않는다. 따라서 1번과 2번 쿼리구문의 결과값이 다르다.
1번 출력값은 커미션을 받는 직원들의 커미션평균값이다.
2번 출력값은 전 사원의 커미션평균값이다.
avg(), nvl()사용해서도 전 사원의 커미션평균값을 구하는 쿼리를 작성할수있다.

강사님코드

1
2
3
4
5
//3. avg(), nvl()사용
select avg(nvl(commssion_pct, 0)) as "Avg_comm3"
from employees

//출력값 : .072897196




count()예시

counts는 null을 포함하여 수를 셀지 여부와 중복값을 포함여부에 따라 달라진다.

count(*) : null포함, 중복값포함한 카운트

80번 부서에 소속된 사원수를 구하는 쿼리구문이다.

1
2
3
$ select count(*)
$ from employees
$ where department_id = 80;




count(expr) : null제외, 중복값포함한 카운트.

80번 부서에 소속된 직원중 커미션을 받는 사원수를 구하는 쿼리구문이다.

1
2
3
$ select count(commission_pct)
$ from employees
$ where department_id = 80;




count(distinct expr) : null제외, 중복값제외한 카운트.

employees테이블의 department_id갯수를 구하는 쿼리구문이다.

1
2
$ select count(distinct department_id)
$ from employees