행(ROW)들의 집합에 대해 연산을 하는 것이므로 행들의 집합 수 만큼 결과가 반환된다. 테이블은 GROUP BY절에 의해 그룹으로 나누어 질 수 있으며 그룹함수(Aggregation Function)는 SELECT문과 HAVING절에 사용 되어 질 수 있다. HAVING절은 GROUP BY 되는 함수에 조건을 주기 위해서 사용 되며 WHERE 절을 이용해서는 안 된다.(그룹핑 칼럼에 조건을 주는 경우는 WHERE절, HAVING절 모두에서 사용가능 하다.)
GROUP BY절을 이용하여 한 테이블에서 행들을 원하는 그룹으로 나누는 것이 가능하며 칼럼 명을 집합 함수와 SELECT절에 이용하고자 한다면 GROUP BY 뒤에 칼럼을 추가 해야 한다. 즉 SELECT절에 그룹함수가 오면 SELECT절의 나머지 칼럼은 GROUP BY절에 나타나야 한다. 또한 GROUP BY절에는 칼럼의 위치 순서 표기(1, 2, 3,,,)나 칼럼 Alias는 사용 할 수 없다.
2. SQL기초강좌_집합함수(Aggreation Function)
집합함수
행(ROW)들의 집합에 대해 연산을 하는 것이므로 행들의 집합 수 만큼 결과가 반환된
다. 테이블은 GROUP BY절에 의해 그룹으로 나누어 질 수 있으며 그룹함수
(Aggregation Function)는 SELECT문과 HAVING절에 사용 되어 질 수 있다. HAVING절
은 GROUP BY 되는 함수에 조건을 주기 위해서 사용 되며 WHERE 절을 이용해서는 안
된다.(그룹핑 칼럼에 조건을 주는 경우는 WHERE절, HAVING절 모두에서 사용가능 하
다.)
GROUP BY절을 이용하여 한 테이블에서 행들을 원하는 그룹으로 나누는 것이 가능하
며 칼럼 명을 집합 함수와 SELECT절에 이용하고자 한다면 GROUP BY 뒤에 칼럼을 추
가 해야 한다. 즉 SELECT절에 그룹함수가 오면 SELECT절의 나머지 칼럼은 GROUP BY
절에 나타나야 한다. 또한 GROUP BY절에는 칼럼의 위치 순서 표기(1, 2, 3,,,)나 칼럼
Alias는 사용 할 수 없다.
4. SQL> create table sawon (
2 name varchar2(10) not null,
3 sal number(8,0),
4 buseo varchar2(10)
5 );
테이블이 생성되었습니다.
SQL> insert into sawon values ('가길동',2000000,'영업부');
SQL> insert into sawon values ('나길동',3000000, '영업부');
SQL> insert into sawon (name, buseo) values ('다길동','영업부');
SQL> insert into sawon values ('라길동',1000000,'관리부');
SQL> insert into sawon values ('마길동',2000000, '관리부');
SQL기초강좌_집합함수(Aggreation Function)
집합함수
5. --5명의 사원을 이름, 급여, 부서를 입력했다. “다길동” 사원은 급여를 입력하지 않았음
에 유의하자. 입력하지 않았으므로 sal 칼럼은 NULL 값으로 채워져 있을 것이다. NULL
값은 아무것도 없다는 뜻이며 어떠한 연산(+,-,*,/)을 하여도 NULL이 된다. NULL 칼럼
인지를 알기 위해서도 마찬가지로 IS NULL을 사용해서 확인 해야 한다.
SQL>commit;
커밋이 완료되었습니다.
SQL> select name, sal, buseo from sawon;
NAME SAL BUSEO
---------- ---------- ----------
가길동 2000000 영업부
나길동 3000000 영업부
다길동 영업부
라길동 1000000 관리부
마길동 2000000 관리부
SQL기초강좌_집합함수(Aggreation Function)
집합함수
6. --지금 입력한 5명의 사원들의 급여 평균은 얼마일까? 총합은 8000000원 이며 5명이므로
1600000 정도가 되리라고 생각이 들것이다. 아래를 보자.
SQL> select avg(sal) from sawon;
AVG(SAL)
----------
2000000
--sal 칼럼이 NULL인 “다길동”은 계산에서 제외 된 것이다. 즉 NULL인 칼럼은 계산을 위한 대상에
서 제외된 것 이다. 다음 예문은 이를 해결 한 것이다.
SQL> select avg(nvl(sal, 0)) from sawon;
AVG(NVL(SAL,0))
---------------
1600000
SQL기초강좌_집합함수(Aggreation Function)
집합함수
7. --아래는 부서별로 GROUP BY하여 부서별 평균을 출력 하는 예문이다.
SQL> select buseo, avg(sal) from sawon
2 group by buseo;
BUSEO AVG(SAL)
---------- ----------
관리부 1500000
영업부 2500000
--SELECT절의 어떤 칼럼 이나 표현식도 집합 함수가 아니라면 GROUP BY절에 나타나야 한다.
SQL> select buseo, avg(sal) from sawon;
select buseo, avg(sal) from sawon
*
1행에 오류:
ORA-00937: 단일 그룹의 그룹 함수가 아닙니다
SQL기초강좌_집합함수(Aggreation Function)
집합함수
8. --아래는 부서별로 GROUP BY하여 부서별 평균을 출력 하는데 그 평균이 2000000 보
다 큰 부서와 그 평균을 출력하는 예문 이다. 그룹함수에 조건을 줄때는 반드시
HAVING절을 써야한다.
SQL> select buseo, avg(sal) from sawon
2 group by buseo
3 having avg(sal) > 2000000;
BUSEO AVG(SAL)
---------- ----------
영업부 2500000
SQL기초강좌_집합함수(Aggreation Function)
집합함수
9. --아래는 EMP 테이블에서 부서별로 급여의 최대를 출력하는데, 부서코드에 따라 오름
차순으로 표시 하는 예문 이다.
SQL> select deptno, max(sal) "급여 최대(부서)"
2 from emp
3 group by deptno
4 order by deptno;
DEPTNO 급여 최대(부서)
---------- -----------------
10 5000
20 3000
30 2850
SQL기초강좌_집합함수(Aggreation Function)
집합함수