만약 부서별 성과급 합계를 알고 싶다면 이렇게 부서당 하나씩의 SELECT문을 만들어 UNION ALL로 다같이 보는 방법도 있겠지만,
GROUP BY를 쓰면 훨씬 손쉽게 묶어서 보여줄 수 있다
문장의 실행 순서상 이런 방식으로 문장이 읽혀진다.
1) EMP 테이블에서
2) DEPTNO가 같은 것끼리 그룹을 짓고
3) DEPTNO와 각 DEPTNO별 성과급 합계를 보여줘
만약 입사년도별 입사자수를 알고 싶다면 이렇게 쓰고 싶겠지만 왜인지 원하는 결과가 나오지 않는다.
1. 먼저 HIREDATE가 연/월/일까지 똑같은 행끼리 그룹이 지어졌고
2. 그 다음에 연도만 뽑는 것은 의미가 없음.
그래서 GROUP BY를 할 때부터 연도만 뽑아놔야 원하는 결과를 얻을 수 있다.
근데 주의할 건 GROUP BY에서 애써 연도별로 묶어놓고 SELECT에서는 그냥 HIREDATE만 쓰면 에러난다.
COUNT(*) 같은 그룹함수 아니고서야 GROUP BY에서 쓴대로 SELECT에 똑같이 써줘야한다.
별칭 사용에도 주의해야 한다. SELECT에서 신나게 별칭 써도 GROUP BY에서는 그 별칭이 뭔지 모른다. 실행순서상 GROUP BY를 먼저 실행한 뒤 SELECT로 넘어가기 때문.
(그럼 GROUP BY 에 별칭을 쓰고 그 별칭을 SELECT에서 가져다 쓰는 건? 이건 애초에 오라클이 허용하지 않는다고 한다. 별칭의 존재이유에 대해 생각해 보면, 결과값의 머릿행을 이해하기 좋게 보여주는 목적일테니 SELECT에서만 쓴다고 생각하는 것이 맘편함)
만약 부서별로 급여가 900 이상인 사람들의 수를 알고 싶다면 어떻게 식을 쓰면 될까?
WHERE을 쓰면 되지 않느냐고 물을 수 있겠지.. 맞다.
그렇다면 부서원의 총급여 합이 9000이 넘는 부서가 어딘지 궁금하면?
이렇게 하고 싶었겠지... 하지만 오류난다. 그룹 함수는 여기에 허락되지 않는다는 오류가 뜬다.
이럴 때 쓸 수 있는 것이 HAVING이다
'근거 있는 일하기_SQL' 카테고리의 다른 글
GROUP BY A, B (0) | 2024.04.19 |
---|---|
HAVING (0) | 2024.04.19 |
함수 NULL 주의 (0) | 2024.04.19 |
ORACLE DB 함수 (5. 일반 함수) (0) | 2024.04.15 |
ORACLE DB 함수 (4. 형 변환 함수) (0) | 2024.04.15 |