데이터베이스
GROUPING - GROUP BY 와 HAVING(feat. oracle)
펭토리
2023. 2. 23. 10:23
1. GROUP BY
'~ 별로' 라는 말이 나오면 거의 Goup By를 사용한다고 생각하면 된다.
값이 같은 행끼리 묶어서 그룹화 하는 것
(전공별 학생 수 출력)
SELECT major1, COUNT(*) FROM student
GROUP BY major1;
(부서별로 직책에 있는 사람이 몇명인지)
SELECT deptno, job, COUNT(*) FROM emp
GROUP BY deptno, job
(실행 순서)
아래와 같은 경우에서는 오류가 난다. 이유는 alias를 통해 만들어진 cnt가 where문보다 늦게 실행되기 때문에 where문은 cnt가 무엇인지 모르기 때문이다.
SELECT job, COUNT(*) as cnt FROM emp
where cnt = 2
GROUP BY job
ORDER BY cnt desc, job desc;
ROLLUP: 하위 합계 생성
중간중간에 아래처럼 하위 합계가 추가된 것을 볼 수 있다.
SELECT deptno, job, SUM(salary)
FROM emp GROUP BY ROLLUP(deptno, job);
CUBE: 결합 가능한 모든 그룹핑(모든 조합의 수)
부서와 직급 조합별 합계를 보여준다.
SELECT deptno, job, SUM(salary)
FROM emp GROUP BY CUBE(deptno, job);
GROUPING SETS: 컬럼별 벌도 처리
부서별, 직업별 별도 합계를 보여준다.
SELECT deptno, job, SUM(salary)
FROM emp GROUP BY GROUPING SETS(deptno, job);
2. HAVING
GROUP BY 결과의 조건을 지정할 때 사용
GROUP BY 한 후 결과의 조건을 주는것!
SELECT major1, AVG(height) FROM student
GROUP BY major1
HAVING AVG(height) >= 170;
SELECT major1, AVG(height) FROM student
WHERE height >= 170
GROUP BY major1;
두 개의 결과가 다르다. 왜냐햐면 첫번째는 Group By를 한 상태로 확인한 평균 키에서 170이 넘는 것을 확인하지만, 두번째는 먼저 WHERE문을 통해 170이 넘는 학생들을 기준으로 평균을 내기 때문에 결과가 다르다