데이터베이스 SQL 구문 기초06(GROUP BY, HAING, 그룹 함수)
그룹(GROUP)
GROUP BY
조건 : HAVING
WHERE는 SELECT문에 대한 조건
그룹 함수
개수: COUNT(*), COUNT(1), COUNT(컬럼)
평균: AVG(컬럼)
최대 최소: MAX(컬럼) MIN(컬럼)
총합: SUM(컬럼)
COUNT()
SELECT COUNT(*), COUNT(1), COUNT(EMPNO), COUNT(COMM)
FROM EMP;
COUNT(컬럼)을 실행하면 결측값 NULL은 없는 취급한다.(NULL값 제외한 개수 출력)
COUNT(*)은 레코드 전체를 읽는다. -> 비효율적
COUNT(1) : 고유의 레코드 번호를 읽는다.(ROWID)
ROWID: 파일 블럭, 블럭 ID 존재->변경X
ROWNUM: INSERT시 들어온 순서
오라클 어딘가에 쿼리 실행 기록이 남아있다.
대용량 DB의 경우 COUNT(1)이 더 효율적
AVG()
SELECT AVG(SAL)
FROM EMP;
평균 무조건 AVG 아님
업무 성격에 따라 다르다.
CEIL()
CEIL : 올림
SELECT CEIL(1.1) FROM DUAL;
2출력
FLOOR()
FLOOR : 내림
SELECT FLOOR(1.1) FROM DUAL;
1출력
TRUNC()
TRUNC(값, 버려서 보여질 자릿수) 디폴트는 전부
EX. TRUNC(1.1234, 1)
SELECT TRUNC(1.1234) FROM DUAL;
1.1 출력
MAX(), MIN()
날짜에는 최소 날짜 최대 날짜
글자에는 앞글자 뒷글자
그룹 함수 관련 에러 케이스
케이스 01
SELECT D.DEPTNO, D.DNAME, MIN(E.SAL) AS MSAL, MAX(E.SAL) AS XSAL
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DEPTNO;
이 쿼리를 실행하면
에러번호: ORA-00979 GROUP BY EXPESSION
오류 발생
그룹함수와 일반 컬럼을 동시에 출력할 경우
반드시 일반 컬럼을 그룹바이에도 넣으라는 것.
일반 컬럼과 그룹함수를 동시에 SELECT할 때에는
GROUP BY 함수에도 일반 컬럼이 모두 들어가야 한다.(강조)
수정한 쿼리
SELECT D.DEPTNO, D.DNAME, MIN(E.SAL) AS MSAL, MAX(E.SAL) AS XSAL
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DEPTNO, D.DNAME;
케이스 02
SELECT DEPTNO, SUM(SAL)
FROM EMP
에러번호: ORA-00937 not single-group group function
GROUP BY 없어서 에러
수정한 쿼리
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO;
케이스 03
SELECT DEPTNO, SUM(SAL)
FROM EMP
WHERE SUM(SAL) > 9000
GROUP BY DEPTNO;
에러번호: ORA-00934: group function is not allowed here
그룹 함수를 where절에서 조건으로 사용하기 때문에 오류 발생
수정한 쿼리
SELECT DEPTNO, SUM(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING SUM(SAL) > 9000;
그룹함수는 그룹 바이 없어도 사용 가능
그룹 바이가 없을 경우엔 테이블 전체를 대상으로 그룹짓는다.
==> 1건의 결과 레코드가 나옴
케이스 04
SELECT DEPTNO, MAX(SUM(SAL))
FROM EMP
GROUP BY DEPTNO;
에러 발생: ORA-00937
GROUP BY로는 DEPTNO까지 출력할 방법 없다.
해결하기 위해선 서브 쿼리를 작성해야 한다.
퀴즈
각 부서별 직업별 급여 총합 출력
SELECT DEPTNO, JOB, SUM(SAL) AS SSAL
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO ASC, JOB ASC;
댓글남기기