서론
테이블의 행의 개수를 구하거나, 특정행들의 숫자값들을 더하고 빼는 등의 연산을 할 수 있는 함수들이 있는데 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 함수이다.