■ 그룹 함수
01. 합을 구하는 SUM 함수
-. SUM 함수는 해당 컬럼 값들에 총합을 구하는 함수이다.
① 급여 총액을 구하는 예제
SQL> SELECT SUM(sal) FROM emp; |
02. 평균을 구하는 AVG 함수
-. AVG 함수는 해당 컬럼 값들에 대해 평균을 구하는 함수이다.
① 급여 평균을 구하는 예제
SQL> SELECT AVG(sal) FROM emp; |
03. 최대 값을 구하는 MAX 함수와 최소 값을 구하는 MIN 함수
-. 지정한 컬럼 값들 중에서 최대 값을 구하는 함수가 MAX이다.
-. 지정한 컬럼 값들
중에서 최소 값을 구하는 함수가 MIN이다.
-.다른 그룹 함수와
달리 이 두 그룹함수는 숫자 타입뿐만 아니라 문자타입, 날짜타입에도 사용가능하다.
① 가장 높은 급여와 가장 낮은 급여를 구하는 예제
SQL> SELECT MAX(sal), MIN(sal) FROM emp; |
② 문자타입, 날짜타입에도 사용가능한 예제
SQL> SELECT MAX(ename), MIN(ename), MAX(hiredate), MIN(hiredate) FROM EMP; |
04. 로우의 개수를 세는 COUNT 함수
-. COUNT 함수는 테이블에서 조건을 만족하는 로우(행)의 개수를 반환하는 함수이다.
-. COUNT 함수에 특정 컬럼을 기술하면 해당 컬럼 값을 갖고 있는 로우의 개수를 계사나여 되돌린다.
① 사원 테이블의 사원들 중에서 커미션을 받은 사원의 수를 구하는 예제
SQL> SELECT COUNT(comm) FROM emp; |
② 부서번호가 10인 사원중에서 커미션을 받는 사원의 수를 구하는 예제
SQL> SELECT COUNT(comm) FROM emp WHERE deptno = 10; |
③ 직원 테이블에서 직원들의 직업 개수를 카운트하는 예제
SQL> SELECT COUNT(job) FROM emp; |
④ ③에서 총 14건이 산출되었음을 살핀 후 다시 다음과 같은 질의를 한다.
SQL> SELECT job FROM emp; |
※ ④의 SELECT 결과를 보면 똑같이 14건이 산출됨을 알 수 있다.
그렇지만 직업이 SALESMAN, MANAGER, CLERK등과 같은 내용이 중복이 되어 있고
COUNT 함수는 그 중복된 로우를 카운트 했음을 알 수 있다.
⑤ 중복되지 않은 직업의 개수를 카운트하는 예제
SQL> SELECT COUNT(DISTINCT job) FROM emp; |
※ DISTINCT : DISTINCT는 중복 행 제거 키워드이다.
-. COUNT 함수를 써서 테이블에 총 몇 개의 행이 들어 있는지를 카운트 할 수도 있다.
-. 이 경우 특정 컬럼 값이 있는가를 세는 게 아니기에 COUNT 함수 안의 값으로 *를 주어 COUNT(*)로 표기한다.
-. 이때는 테이블에 총 몇 건의 행이 있는가의 문제이기에 설령 어떤 로우는 comm에 널 값이 있어도 상관이 없다.
-. 그룹함수는 널 값을 제외한다고 하였는데 COUNT(*)만은 예외로 함을 알 수 있다.
SQL> SELECT COUNT(*) FROM emp; |
⑥ 사원들이 몇 년도에 입사하였는지 조사하여 입사년도 별로 그 해에 입사한 사원들이 인원수를 구하는 쿼리
SQL> SELECT COUNT(*) "total", SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1980, 1, 0)) "1980", SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1981, 1, 0)) "1980", SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1982, 1, 0)) "1980", SUM(DECODE(TO_CHAR(hiredate, 'YYYY'), 1983, 1, 0)) "1980" FROM emp; |
05. 그룹함수와 단순 컬럼
① 직원들의 최대 급여를 구하는 쿼리
SQL> SELECT MAX(sal) FROM emp; |
② ①의 결과는 5,000이라는 한 개의 값이 산출된다. 그럼 여기에서 아래와 같이 직원들의 이름을 함께 출력하는 쿼리를 실행한다.
SQL> SELECT MAX(sal), ename FROM emp; |
에러) ORA-00937: 단일 그룹의 그룹 함수가 아닙니다 00937. 00000 - "not a single-group group function" |
풀이)
에러가 발생하는 이유는 위의 그림처럼 그룹 함수의 결과값은 하나인데 비해 그룹 함수를 적용하지 않은 단순 컬럼의 개수는 14개로,
둘의 산출되는 로우가 다르므로 둘을 매치 시킬 수가 없기 때문이다. 즉 5000이라는 값을 SMITH에 붙일 수도 없고 ALLEN에 붙일 수도 없기 때문이다.
※ SELECT LIST에 그룹함수를 사용하는 경우, 그룹함수를 적용하지 않은 단순 컬럼은 올 수 없다는 사실을 명심해야 한다.
'Oracle > Oracle Programming' 카테고리의 다른 글
[Oracle] HAVING 절 (1) | 2012.11.25 |
---|---|
[Oracle] GROUP BY 절 (0) | 2012.11.25 |
[Oracle] 중복되는 컬럼을 한 번씩만 보여주기 위한 DISTINCT 키워드 (0) | 2012.11.06 |
[Oracle] Concatenation 연산자의 정의와 사용 (0) | 2012.11.06 |
[Oracle] 별칭 (0) | 2012.11.06 |