본문 바로가기
공부/Oracle

오라클 SQL 문법 공부13 - GROUP 함수 (COUNT, SUM, MAX, MIN, AVG)

by 리빈아빠 2017. 10. 26.
반응형

서론

테이블의 행의 개수를 구하거나, 특정행들의 숫자값들을 더하고 빼는 등의 연산을 할 수 있는 함수들이 있는데 GROUP 함수라고 한다. 단독으로도 쓰일 수 있고 추후에 GROUP BY 절과 함께 자주 쓰이는 함수들이니 꼭 알고 있는 것이 좋겠다.

본론

COUNT 함수

GROUP 함수
--여러 건의 데이터를 한꺼번에 처리하는 그룹 함수
--COUNT()함수
--그런데 그냥 COUNT(*) 하면 모든 행 갯수를 셈
--COUNT(COMM) 이렇게 하면 COMM컬럼에 NULL이 있으면 제외하고 셈
--
--*로 COUNT 하면 전체 데이터가 NULL인지 체크하기 때문에 성능상 좋지 않음
--그래서 그냥 전체 행 개수 셀때는 COUNT(1) 이런걸로 하면 좋은듯
--정렬을 DESC 하고 NOT NULL 컬럼 찾아서 그걸로 COUNT 하는게 성능상 좋음
--개발할때 COUNT(*) 이런걸로 쿼리 짜는 개발자 있으면 다 바꾸라고 해야됨
--
--NOT NULL 컬럼 중에 왜 특정 컬럼으로 하면 성능이 더 좋은지는 인덱스와 관련이 있음
--아마 PRIMARY 키는 인덱스도 있고 NOT NULL이라 개수 셀때 가장 좋은 컬럼인 것 같다.

 SELECT COUNT(*) FROM EMP;
 SELECT COUNT(EMPNO) FROM EMP;

데이터가 적을때에는 아스타를 쓰든 아무 컬럼을 쓰든 크게 속도에 문제가 없겠지만 많을 경우에는 되도록이면 NOT NULL 표기가 되어 있는 기본키 컬럼으로 지정하여 구해주는 것이 좋겠다. 참고로 NULL이 있는 컬럼을 COUNT 할 경우에는 NULL 값이 있는 행은 COUNT에 포함되지 않으니 주의하자.


또한 COUNT를 할 경우에는 값이 행의 개수를 표현하는 것이기 때문에 결과값 자체가 COUNT한 개수로써 한 행으로만 나온다. 따라서 WHERE 절 조건이 없는 경우에 COUNT외에 다른 컬럼을 SELECT 절에다가 적어주면 당연히 오류가 발생한다. 왜냐하면 SELECT 절에 컬럼만 적으면 해당 컬럼의 모든 행이 표현되어야 하는데 (복수행) 한 행으로 결과값이 나오는 COUNT 함수(단일 행)와 매치가 안되기 때문이다. (복수행 != 단일행)


특정 값들에 대한 COUNT 등을 구하고 싶을 때는 다음에 다뤄볼 GROUP BY 구절을 사용해야 가능하다.

2017/10/27 - [공부/Oracle] - 오라클 SQL 문법 공부14 - GROUP BY 절, HAVING 절

SUM, MAX, MIN, AVG

--SUM() 함수
--합계 구하는 함수

--AVG() 함수 평균 구하는 함수
--이것도 NULL 확인함
--평균 = 총합 / 총수

--아래 결과값이 다른 이유는 전체 직원의 평균은 모든 직원과 COMM 받는 사람들의 평균인데
--AVG로 해버리면 COMM 받는 사람들끼리만 평균을 낸다
--AVG함수는 NOT NULL 데이터에 대해서만 평균을 계산한다.
--COUNT와 AVG만 NULL 체크 하여 NULL이 아닌 것들만 계산을 해준다

SELECT SUM(COMM)/COUNT(EMPNO) AS "전체 직원 평균",
AVG(COMM) AS "COMM이 있는 직원들의 평균"
FROM EMP;
--AVG함수 연산의 행의 개수와 COUNT함수 연산의 행의 개수가 다르기 때문에
--원하는결과 값을 얻을 수가 없다.

--COMM 없는 것도 같이 전체 평균을 내고 싶다면.. NVL처리 해주면 될듯
SELECT SUM(COMM)/COUNT(EMPNO) AS "전체 직원 평균",
AVG(NVL(COMM, 0)) AS "COMM이 있는 직원들의 평균"
FROM EMP;

--NULL값을 허용하지 않는 컬럼들이 실무에 많다.
--성능상의 문제

--MAX() 최대 데이터, MIN() 최소 데이터
--문자, 날짜, 숫자 형태 다 됨

SELECT * FROM EMP;
SELECT MAX(COMM), AVG(SAL) FROM EMP;
SELECT AVG(COMM), AVG(SAL) FROM EMP;

특별한건 없고 GROUP 함수들은 모두 한 행으로 결과값을 나타내기 때문에 GROUP 함수가 아닌 일반 컬럼들을 SELECT 절에 포함하여 표현할 수는 없지만 GROUP 함수들만은 포함시켜 SELECT 할 수가 있다.

실습문제

이번 실습문제는 패스

결론

GROUP 함수들은 단일행으로 표현해주는 함수들이기 때문에 평소에 SELECT 절에 사용 하였던 컬럼과 동시에 GROUP 함수들을 사용하면 안될 것이다. 이 함수들을 사용할 때 어떻게 표현될지에 대해 상상해 보면 쉽게 이해될 것이라 믿는다. 필자도 처음에는 왜 안되지 이상하다 라고 생각했던 것들이 GROUP 함수이다.