MySql - 그룹함수 (Group function)

Agnes Park·2022년 3월 20일
1

DATABASE

목록 보기
9/9

1. 그룹함수

여러개의 레코드의 필드 값을 계산하여 값을 내는 함수
다양한 그룹함수들이 있다.

  • GROUP BY : 그룹을 묶는 단위
  • HAVING : 그룹함수 결과에 대한 조건 (WHERE 와 헷갈리지 않도록 주의)

https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions-and-modifiers.html

그룹 함수 예

SELECT COUNT(*), COUNT(hpage) FROM professor;
SELECT COUNT(bonus), SUM(bonus) FROM professor;
SELECT COUNT(bonus), SUM(bonus), AVG(bonus) FROM professor;
SELECT MAX(hiredate), MIN(hiredate) FROM emp;

2. GROUP BY

GROUP BY 예시
Professor 테이블에서 학과별로 교수들의 평균 보너스를 출력하세요

SELECT deptno, AVG(bonus) FROM professor GROUP BY deptno;
SELECT deptno, AVG(IFNULL(bonus, 0)) FROM professor GROUP BY deptno;

3. HAVING : 그룹 함수에 조건 추가

HAVING : 그룹 함수에 조건 추가 예시

SELECT deptno, AVG(pay) FROM professor WHERE AVG(pay) > 450 GROUP BY deptno;

그룹함수 부분은 WHERE 사용 불가.
그룹함수를 사용하더라도 다른 부분은 WHERE 사용 가능

4. SELECT 쿼리문 순서

SELECT [컬럼명 또는 표현식] 
FROM [테이블명, 뷰명]  
WHERE [조건절]  
GROUP BY [그룹할 컬럼] 
HAVING [그룹함수 조건절]   
ORDER BY [정렬열] [ASC/DESC];

[Agg1.sql]

SELECT * FROM t_professor;

SELECT count(*) FROM t_professor;
SELECT count(name), count(hpage) FROM t_professor;	-- 그룹함수에서 NULL 값은 (기본적으로) 계산에서 제외
SELECT count(bonus), sum(bonus), avg(bonus) FROM t_professor;
SELECT max(hiredate), min(hiredate) FROM t_emp;

-- 교수님들의 보너스 평균값 출력 ( AVG() 사용)
-- 그룹함수 null 값은 계산안하기 때문에
-- null 허용 필드에 대해 계산할때는 반드시 infull 등을 사용하여 처리해야 함
SELECT
	avg(bonus),
	avg(ifnull(bonus, 0))
FROM t_professor 
;

-- GROUP BY

-- 교수님 테이블에서 '학과별' 로 교수님들의 평균 급여를 select 하기
select deptno, avg(pay) FROM t_professor;

-- SELET 절에 그룹함수 아닌 것과 그룹함수는 같이 올수는 없다.
-- 이 경우 그룹함수가 아닌 것들은 GROUP BY 로 묶여야 할 것이다.
SELECT deptno, avg(pay)
FROM t_professor 
GROUP BY deptno;

-- # 5101
# t_professor 테이블 : 학과별(deptno) 그리고 직급별(position)로 교수들의 평균 급여를 계산하여 출력하세요
SELECT deptno, POSITION, avg(pay) "평균급여"
FROM t_professor 
GROUP BY deptno, POSITION
ORDER BY deptno ASC, POSITION ASC
;

-- 학과별 평균급여를 출력하되 평균급여가 300보다 많은 학과만 출력
SELECT deptno, avg(pay)
FROM t_professor
WHERE avg(pay) > 300	-- 그룹함수는 절.대.로 WHERE 절에서 사용 불가.
GROUP BY deptno;

-- HAVING 절 사용
SELECT deptno, avg(pay)
FROM t_professor 
GROUP BY deptno
HAVING avg(pay) > 300
;

-- 				처리순서
-- SELECT 		-- (5)
-- FROM			-- (1)
-- WHERE		-- (2)
-- GROUP BY		-- (3)
-- HAVING 		-- (4)
-- ORDER BY		-- (6)

-- #5102)연습
-- t_emp 테이블: 매니저별(MGR)로 관리하는 직원들의
-- ‘매니저’, ‘직원수’와 ‘급여총액’과 ‘급여평균’과 ‘교통비 (COMM) 평균’ 지급액 을 출력하세요.
-- 단 사장님은 (job = president)제외 

SELECT
	mgr "매니저",
	count(*) 직원수,
	sum(sal) 급여총액,
	avg(sal) 급여평균,
	avg(ifnull(comm, 0)) 교통비평균
FROM t_emp
WHERE job != 'PRESIDENT'
GROUP BY mgr 

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN