그룹함수 : 여러개의 행을 입력으로 받아 하나의 행으로 결과를 반환하는 함수
*많이 쓰이는 함수, 잘 알아두자 ( 개념적으로 혼돈하지 말고 잘 정리하자 - select 절에 올 수 있는 컬럼에 대해 잘 정리 )
오라클 제공 그룹함수
MIN (컬럼 | 익스프레션 ) : 그룹중에 최솟값을 반환 / 문자열은 가장 먼저 오는 알파벳? 인듯
MAX (컬럼 | 익스프레션 ) : 그룹중에 최대값을 반환
AVG( 컬럼| 익스프레션 ) : 그룹의 평균값을 반환
SUM (컬럼 | 익스프레선) : 그룹의 합계값을 반환
COUNT ( 컬럼 | 익스프레션 | * ) : 그룹핑된 행의 갯수
SELECT 행을 묶을 컬럼, 그룹함수 ( *그룹함수가 select 자리에 오는구나 !!! )
FROM 테이블명
[WHERE]
GROUP BY 행을 묶을 컬럼;
SELECT *
FROM emp
ORDER BY deptno;
SELECT deptno, MIN(enam) , count(*) , MIN(sal ), MAX(sal), SUM(sal), AVG(sal)
FROM emp
GROUP BY deptno ;
* 오류를 해결하는 법 : 부서이름에 함수를 적용해주면 됨
그룹함수에서 많이 어려워 하는 부분
SELECT 절에 기술할 수 있는 컬럼의 구분 : GROUP BY 절에 나오지 않은 컬럼이 SELECT 절에 나오면 에러
- 전체 행을 대상으로 그룹핑을 할경우 즉 전체행을 그룹으로 묶으면 전체행이 그룹이 되지 않게 중복되지 않는 값이기 때문에 13행이면 그룹핑하면 13행이 나옴. 즉 이말을 잘 이해할 필요가 있다.
전체 행을 대상으로 그룹핑을 할경우 GROUP BY 절을 기술하지 않는다.
SELECT MAX (sal)
FROM emp;
* 그룹핑할경우 전체 직원중에 가장 큰 급여 값을 알 수는 있지만 해당 급여를 받는 사람이 누군지는 그룹함수만 이용해서는 구할 수 없다. -> 추후진행 (그룹핑을 GROUP BY SAL로 하면 sal각각 사람이아니라 sal금액에 해당하는 사람들이 1행으로 묶이기 때문에 )
-COUNT 함수 * 인자
* : 행의 개수를 반환
컬럼 | 익스프레션 : NULL 값이 아닌 행의 개수
그러니까 숫자를 세는데 NULL값을 빼고 세는 것임
다른함수에서는 *는 못쓰지만 COUNT 함수에서만 쓸 수 있음
SELECT *
FROM emp;
SELECT COUNT(*), COUNT(mgr), COUNT(COMM)
FROM emp;
그룹함수의 특징 : NULL값을 무시
NULL 연산의 특징 : 결과 항상 NULL이다.
그룹함수에서 계산을 할때 NULL값을 가진 애들을 빼버리고 계산
EX) COMM 함수에 4개 뺴고 NULL이다 그러면 SUMM함수를 쓰면 연산해서 NULL이 나올거 같지만 NULL을 빼고 나머지를 합해서 씀
SELECT SUM (sal + comm), SUM(sal) + SUM(comm)
FROM emp;
했을때
그룹함수 특징 2 : 그룹화와 관련없는 상수들은 SELECT 절에 기술할 수 있다.
그룹화와 관련있는 상수는 쓸 수 있네.
SELECT deptno, SYSDATE, 'TEST' , 1, COUNT(*)
FROM emp
GROUP BY deptno;
그룹함수 특징 3
single row 함수의 경우 where 에 기술하는 것이 가능하다.
ex) SELECT *
FROM emp
WHERE ename = UPPER('smith') ;
그룹함수의 경우 where 에서 사용하는 것이 불가능하다.
-> HAVING 절에서 그룹함수에 대한 조건을 기술하여 행을 제한 할 수 있다.
그룹함수는 where 절에 사용 불가
SELECT deptno, COUNT(*)
FROM emp
WHERE count(*) > = 5
GROUP BY deptno;
------> 여기에 where 절을 넣으면 안된다.
SELECT deptno, COUNT(*)
FROM emp
GROUP BY deptno
HAVING COUNT(*) >= 5 ;
--> WHERE 절은 못쓰니까 HAVING 절을 쓴다.
기본 뼈대 정리
SELECT 행을 묶을 컬럼, 그룹함수
FROM 테이블명
[WHERE]
[GROUP BY ] 행을 묶을 컬럼
[HAVING]
[ORDER BY]
* HAVING 과 WHERE 는 같이 못쓴다.
둘은 사용가능해 그렇지만 GROUP BY 에 대상이 되는 행들을
SELECT deptno, count(*)
FROM emp
WHERE sal > 1000
GROUP BY deptno
얘는 사용이 가능하다
GROUP FUNCTION 실습 grp1
SELECT MAX ( SAL ) max_sal , MIN(sal) min_sal, ROUND ( ( AVG(sal) ) , 2 ) avg_sal,
SUM(sal) sum_sal, COUNT(sal) count_sal, COUNT(mgr) count_mgr, COUNT(*) count_all
FROM emp
Function ( group function 실습 grp2)
SELECT deptno, MAX(sal) max_sal , MIN(sal) min_sal, ROUND (AVG(sal) , 2 ) avg_sal,
SUM (sal) sum_sal , COUNT(sal) count_sal, count(mar) count_mgr , count(*) count_all
FROM emp
GROUB BY deptno 확인해보기
** group by 절에 기술한 컬럼이 select 절에 오지 않아도 실행에는 문제는 없다.
Function ( group function 실습 grp3)
SELECT
CASE
WHEN deptno = 10 THEN 'ACCOUNTING'
WHEN deptno = 20 THEN 'RESEARCH'
WHEN deptno = 30 THEN 'SALES'
ELSE null
END dname , MAX(sal) max_sal , MIN(sal) min_sal, ROUND ( (AVG(sal)) , 2 ) avg_sal,
SUM (sal) sum_sal , COUNT(sal) count_sal, count(mar) count_mgr , count(*) count_all
FROM emp
GROUP BY deptno;
GROUB BY deptno
Function ( group function 실습 grp4 )
SELECT TO_CHAR( hiredate, 'YYYYMM') hire_yyyymm , COUNT( TO_CHAR( hiredate, 'YYYYMM') ) cnt
FROM emp
GROUP BY TO_CHAR( hiredate, 'YYYYMM') ;
댓글
댓글 쓰기