Maria DB : 그룹 함수

최혜린·2024년 10월 19일

그룹함수

  • 그룹 함수는 하나 이상의 행을 그룹으로 묶어 연산하여 총합, 평균 등 하나의 결과로 나타낸다.
구분설명
SUM그룹의 누적 합계를 반환한다.
AVG그룹의 평균을 반환한다.
COUNT그룹의 총 개수를 반환한다.
MAX그룹의 최대값을 반환한다.
MIN그룹의 최소값을 반환한다.
STDDEV그룹의 표준편차를 반환한다.
VARIANCE그룹의 분산을 반환한다.

1. SUM 함수

  • SUM 함수는 해당 칼럼 값들에 대한 총합을 구하는 함수이다.

	# 모든 사원들의 월급의 합계를 출력
	SELECT SUM(sal) FROM emp;

❗. 커미션의 총합을 구해도 NULL 값으로 출력되지 않는다. 왜냐하면
그룹 함수는 다른 연산자와는 달리 해당 칼럼 값이 NULL 인 것을 제외하고 계산하기 때문이다.


2. AVG 함수

  • AVG 함수는 해당 칼럼 값들에 대해 평균을 구하는 함수이다.
  • 칼럼 값이 NULL 인 것에 대해서는 제외하고 계산한다.
	# 평균 급여
	SELECT AVG(sal) FROM emp;

3. MIN, MAX 함수

  • 최대값 구하는 MAX, 최소값 구하는 MIN 함수

	# 사원들 중 가장 높은 급여를 받는 사원의 sal를 출력
	SELECT MAX(sal) FROM emp;
    
    #사원들 중 가장 낮은 급여를 받는 사람의 이름과 급여를 출력
	SELECT ename,MIN(sal) FROM emp;
	
	#문데 : 최근에 입사한 사원의 이름과 입사일을 출력
	SELECT ename, MAX(hiredate) FROM emp;
	

4. COUNT 함수

  • COUNT 함수는 테이블에서 조건을 만족하는 행의 개수를 반환하는 함수다.
  • COUNT 함수는 NULL 값에 대해서는 개수를 세지 않는다.

	# 사원수를 출력하세요
	SELECT COUNT(empno) FROM emp;
    # COUNT(*)처럼 *를 적용하면 테이블의 전체 로우 수
	SELECT COUNT(*) FROM emp; 
    # 이렇게 넣으면 null 이 아닌것만 카운팅 되서 값이 달라짐
	SELECT COUNT(comm) FROM emp; 
	
	# 직업 종류의 갯수르 구하세여
    #종류를 구하는건데 전체 job의 갯수가 잡힘
	SELECT COUNT(job) FROM emp; 
    # 이렇게 하면 중복은 1개로 처리된다
	SELECT COUNT(DISTINCT job) FROM emp; 
	
	# 문자 : 10번 부서 소속 사원 중 커미션을 받는 사람의 수
	SELECT COUNT(comm) FROM emp
	WHERE deptno = 10 ; # 다 null이라 0
	SELECT * FROM emp WHERE deptno  = 10; 

5. GROUP BY 절

  • 그룹함수를 쓰되 어떤 컬럼 값을 기준으로 그룹함수를 적용할 경우 GROUP BY 절 뒤에 해당 컬럼을 기술하면 된다.
  • 주의할 점은 GROUP BY 절 다음에는 칼럼의 별칭을 사용
    할 수 없고, 반드시 칼럼명을 기술해야 한다.

소속 부서별 평균 급여 예제

	# 소속 부서별 평균 급여를 구하세여
	SELECT deptno, AVG(sal)
	FROM emp
	GROUP BY deptno;

주의할 점 ❗

	#주의할 사항 1
	SELECT deptno, job , AVG(sal)
	FROM emp
	GROUP BY deptno;

다음과 같은 쿼리의 문제점은 job 컬럼이 포함되어있다는 것이다.
job을 함께 선택하면 각 부서에 속한 job의 가장 상단만 나와 정확성이 떨어질 수 있다.

해결 방법

필요한 집계 결과만 남기고 나머지 컬럼은 제외하는 것이 좋다.
기준을 다수로 둘거라면 아래와 같이 모든 컬럼에 대해 GROUP BY를 설정해줘야 한다.

	SELECT deptno, job , AVG(sal)
	FROM emp
	GROUP BY deptno,job;

이외 예제

	# 문제 : 부서별 사원수와 커미션을 받는 사원수를 출력
	SELECT deptno, COUNT(empno),COUNT(comm) FROM emp GROUP BY deptno;
	
	# 문제 :  부서별 최대 급여 최소급여
	SELECT deptno, MAX(sal), MIN(sal) FROM emp GROUP BY deptno; 

5-1. HAVING 조건

  • SELECT 절에 조건을 사용하여 결과를 제한할 때는 WHERE 절을 사용하지만 그룹의 결과를 제한할 때는 HAVING 절을 사용한다.

예제

	# 부서별로 그룹 지은 후(GROUP BY), 그룹 지어진 부서별 평균
	# 급여가 2000 이상인(HAVING) 부서번호와 부서별 평균 급여를 출력
	SELECT deptno, AVG(sal)
	FROM emp 
	GROUP BY deptno
	HAVING AVG(sal) >= 2000;
    
    # 문제: 평균급여가 2900이상인 부서의 최대급여 최소급여
	SELECT deptno, max(sal),MIN(sal)
	FROM emp 
	GROUP BY deptno
	HAVING AVG(sal) >= 2900;

5-2. WITH ROLLUP

  • SQL의 그룹 바이 구문에서 사용하는 옵션으로, 집계 결과에 추가적인 합계를 포함시키는 기능이다.

부서별과 직업별로 급여를 집계하는 쿼리, 각 부서별로 총 매출과 전체 매출 출력 예제

	SELECT deptno,job, SUM(sal) AS "부서별 합계"
	FROM emp
	GROUP BY deptno,job WITH ROLLUP

부서별과 직업별로 급여를 집계하는 쿼리, 각 직업별로 총 매출과 전체 매출 출력 예제

	SELECT job, deptno, SUM(sal) AS "직업별 합계"
	FROM emp
	GROUP BY job, deptno WITH ROLLUP;

profile
산으로 가는 코딩.. 등산 중..🌄

0개의 댓글