햄코딩
SQL DAY 3 본문
220512 DAY 20 정리중
■ 그룹 함수
- 하나 이상의 행을 그룹으로 묶어 하나의 결과로 나타낸다.
- 그룹 함수는 수행 결과가 다중행 (단일행 함수는 수행 결과가 단일행)
- SUM, AVG, COUNT, MAX, MIN, STDDEV, VARIANCE
- GROUP BY, HAVING
■ GROUP BY
- 특정 그룹을 만들어서, 그 그룹 안에서 계산한다.
- group by 뒤에 오는 속성을 기준으로 그룹을 만든다.
- group by 뒤에 오는 속성은 ,(comma)를 사용하여 여러 개 올 수 있다.
💡 주의
1. group by는 그룹 함수와 함께 사용한다.
2. group by의 위치는 order by 앞
3. group by의 select 절에는 그룹 함수와 group by 뒤에 오는 속성만 올 수 있다.
1. max, min, sum, avg, count
select max(sal) from emp;--최대값
select min(sal) from emp;--최소값
select sum(sal) from emp;--합계
select avg(sal) from emp;--평균
select trunc(avg(sal), 2) from emp;--평균 소수점 두자리로 절삭
select count(sal) from emp;--월급 받는 사람 수
2. 그룹함수는 단일 속성과 함께 쓸 수 없다.
--누가 max(sal)을 가질까?
select ename, max(sal) from emp;--error
--ename은 14개가 존재, max(sal)은 14개를 합친 하나이므로, 둘은 같이 쓸 수 없다.
select ename, max(sal) from emp group by ename;--모든 그룹 다 나옴.
select job, max(sal) from emp group by ename;--error, group by 기준 속성 아니면 에러
select deptno, max(sal) from emp group by deptno;--각 부서별 max(sal)값이 나옴.
select job, sum(sal) from emp group by job;--각 직위별 sum(sal)값이 나옴.
select job, max(sal), min(sal), sum(sal), avg(sal), count(sal) from emp group by job;
select deptno, max(sal), min(sal), sum(sal), trunc(avg(sal), 2), count(sal)
from emp group by deptno;
3. group by된 조회 결과를 order by해서 정렬하는 것이다.
select deptno, sum(sal) from emp group by deptno order by deptno;
select deptno, sum(sal) from emp order by deptno group by deptno; --error
■ HAVING
- group by에 조건절을 만드는 명령어
- select문에서 where의 역활과 비슷
- group by의 결과에 대해서 where처럼 출력 결과에 조건을 건다.
- having deptno = 10; having sum(sal) > 9000;
- having + 조건 기준 속성 + 비교연산자 + 조건비교값
- 조건 기준 속성 : group 함수와 group by의 기준 속성만 온다.
- group by의 select 절에는 group 함수와 group by의 기준 속성만 온다.
- and, or를 통해 조건을 확장할 수 있다.
----> GROUP BY로 SAL의 합계 조회
SELECT DEPTNO, SUM(SAL) FROM EMP GROUB BY DEPTNO;
----> GROUP BY 로 조회된 결과에 대해서 조건을 제한 (9000보다 큰 월급 합계)
SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO HAVING SUM(SAL) > 9000;
SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO HAVING SUM(SAL) > 9000 AND DEPTNO = 20;
SELECT DEPTNO, SUM(SAL) FROM EMP GROUP BY DEPTNO HAVING SUM(SAL) > 9000 OR DEPTNO = 10;
----> EMP 테이블에서 DEPTNO 별 SAL 평균값을 구한다. (단, SAL 평균값이 2000이상인 것만 표시)
SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >= 2000;