그룹함수
SUM 함수
사원의 급여를 출력하되 단일행 함수 ROUND로 천단위 이하를 반올림하는 쿼리문
SQL> SELECT DEPTNO, SAL, ROUND(SAL, -3) FROM EMP; 단일행 함수는 각 행에 대해서 함수의 결과가 구해지기 때문에 결과가 여러 개의 로우로 구해진다.
-
그룹 함수를 이용해서 사원의 총 급여를 구하는 쿼리문
SQL> SELECT SUM(SAL) FROM EMP; 그룹함수의 결과는 사원이 총 14명인데도 결과는 하나의 행으로 출력된다.
-
예) 커미션(COMM) 총액을 구하는 쿼리문
SQL> SELECT SUM(COMM) FROM EMP; 커미션(COMM)의 총합을 구한 결과가 NULL값으로 출력되지 않는 이유는 그룹 함수는 다른 연산자와는 달리 해당 컬럼 값이 NULL인 것은 제외하고 계산하기 때문이다.
Avg
예) 급여 평균을 구하는 쿼리문
SQL> SELECT AVG(SAL) FROM EMP;
Max, ,Min
- MAX : 지정한 컬럼 값 중에서 최대값을 구하는 함수이다.
- MIN: 해당 컬럼 값들의 최소값을 구하는 함수이다.
- 예) 가장 높은 급여와 가장 낮은 급여를 구하는 쿼리문
SQL> SELECT MAX(SAL), MIN(SAL) FROM EMP;
- 예) 가장 높은 급여와 가장 낮은 급여를 구하는 쿼리문
- 만약 사원들의 최대 급여와 최대 급여를 받는 사원의 이름도 함께 구하려면 어떻게 해야할까?
- [SELECT ENAME, MAX(SAL) FROM EMP;]를 실행해보자. 오류가 날 것이다.
- 그 이유는 그룹 함수의 결과값은 하나인데, 그룹 함수를 적용하지 않은 단순 컬럼의 로우의 개수는 14개이기 때문에 산출되는 로우의 수가 달라 둘을 매치 시킬 수 없기 때문이다.
count
- 테이블에서 조건을 만족하는 행위 개수를 반환하는 함수이다.
- COUNT 함수에 특정 컬럼을 기술하는 경우 해당 컬럼 값을 갖고 있는 로우의 개수를 계산하여 반환한다.
- COUNT 함수는 NULL값에 대한 개수를 세지 않는다.
- [SELECT JOB FROM EMP ORDER BY JOB;]를 실행하면 같은 내용이 중복되어 있고, 중복된 로우까지 카운트 하고 있다는 것을 알 수 있다. 이럴땐 중복행 제거 키워드인 DISTINCT 함수를 사용하면 된다.
- 예) 사원 테이블의 사원들 중에서 커미션(COMM)을 받은 사원의 수를 구하는 쿼리문
SQL> SELECT COUNT(COMM) FROM EMP;
- 예) 중복 제거를 반영하여 담당업무의 개수를 구하는 쿼리문
SQL> SELECT COUNT(DISTINCT JOB) 업무수 FROM EMP;
group by 절
- 특정 컬럼을 기준으로 그룹화하여 테이블에 존재하는 행들을 그룹별로 구분하기 위해 사용한다.
- 그룹 함수를 쓰되, 어떤 컬럼값을 기준으로 그룹 함수를 적용할지 기술해야 한다.
- 예) 사원 테이블을 부서 번호로 그룹 짓는 쿼리문
SQL> SELECT DEPTNO FROM EMP GROUP BY DEPTNO;
- 예) 소속 부서별 평균 급여를 구하는 쿼리문
SQL> SELECT AVG(SAL) FROM EMP GROUP BY DEPTNO; 이 경우에는 어느 부서의 평균값인지의 정보가 결여되어 의미 있는 정보가 아니다. 고로 어떤 부서의 평균인지 알아보기 위해 부서 번호도 SELECT 절에 함께 기술해야 한다. SQL> SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO; 그런데! 그룹함수 사용시 그룹함수를 적용하지 않은 단순 컬럼은 SELECT절에 함께 사용할 수 없다 했는데 에러가 나지않고 제대로 결과가 나온 이유는?! GROUP BY를 사용하면 매치가 가능하기 때문이다.
- 예) GROUP BY절에 명시하지 않은 컬럼을 SELECT절에 사용한 잘못된 쿼리문
SQL> SELECT DEPTNO, ENAME, AVG(SAL) FROM EMP GROUP BY DEPTNO;
- 예) 소속 부서별 급여 총액과 평균 급여를 구하는 쿼리문
SQL> SELECT DEPTNO, SUM(SAL), AVG(SAL) FROM EMP GROUP BY DEPTNO;
- 예) 소속 부서별 최대 급여와 최소 급여를 구하는 쿼리문
SQL> SELECT DEPTNO AS 부서번호, MAX(SAL) AS 최대급여, MIN(SAL) AS 최소급여 FROM EMP GROUP BY DEPTNO;
- 예) 부서별 사원의 수와 커미션을 받는 사원의 수를 계산하는 쿼리문
SQL> SELECT DEPTNO, COUNT(*), COUNT(COMM) FROM EMP GROUP BY DEPTNO;
habing조건
- GROUP BY 절에 의해 생성된 결과 값 중 원하는 조건에 부합하는 자료만 보고자 할 때 사용한다.
-
예) 그룹 지어진 부서별 평균 급여가 2000 이상인 부서의 번호와 부서별 평균 급여를 출력하는 쿼리문
SQL> SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO;
SQL> SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;
-
예) 부서의 최대값과 최소값을 구하되, 최대 급여가 2900 이상인 부서만 출력하는 쿼리문
SQL> SELECT DEPTNO, MAX(SAL), MIN(SAL) FROM EMP GROUP BY DEPTNO HAVING MAX(SAL) >= 2900; (2900이상이므로 >=이 옳은 표현입니다. 오타를 찾아내주신 scscs님 감사합니다.)