230309 (GROUP BY_HAVING)
「GROUP BY_HAVING」
★ 중요한 3가지 : 쓰는 순서 | 실행 순서 | 각 절의 의미(어떨 때 쓰는지)
≫ 절 순서는 바뀌면 절대 안 됨 !
1. SELECT / FROM은 필수로 사용
+ 조건이 들어가야 한다면 WHERE
+ 정렬을 해야 한다면 ORDER BY 등은
(내가 필요로 하는 경우에 추가하면 됨.)
2. 필요로 섞어쓰면 되지만, 우선 순위만 지켜주면 됨
ex)
SELECT
FROM
GROUP BY
ORDER BY
3. 별칭으로 ORDER BY
4. NULLS FIRST | LAST
≫ NULLS LAST가 기본 값이라 뒤쪽으로 정렬되는데
NULLS FIRST는 NULL을 앞쪽으로 정렬할 수 있다
💌 GROUP BY
▷ 그룹 함수는 단일행 함수와 함께 사용할 수 없다
// 왜냐하면 결과만 봐도 행의 개수가 서로 다르기 때문
★ 그러면 전체 SALARY의 값 말고,
DEPT_CODE 마다의 SUM(SALARY)로 각각 묶어 합계를 구하면?
≫ 그러면 DEPT_CODE 별로 합계가 출력돼 오류 발생하지 않음!
≫ 각 DEPT_CODE 별로 SUM(SALARY)가 나오는 것을 알 수 있다.
+ TIP )
일반 컬럼(단일행 함수)과 그룹 함수가 같이 쓰이면,
어차피 행의 개수가 맞지 않기 때문에
GROUP BY는 무조건 진행해야 한다. (행 개수 맞추기 위해)
그럼 GROUP BY에 뭘 넣어야 할까?
행이 1개만 나오는 그룹 함수를 제외하고
나머지 여러 개의 행이 나오는 것들을
GROUP BY에 집어넣으면 된다!
허나 문제는.. ▽ (훑어보기)
1)
≫ DEPT_CODE도 보고, DEPT_CODE 마다의 SUM(SALARY)을 볼 수 있다.
2)
≫ DEPT_CODE로 묶기만 할 뿐 결과는 SUM(SALARY)이 출력
이런 다른 점들을 주의하자!
문제 풀어보기
(하나씩 해석 해가면서 풀어보는 게 좋음)
1)
2)
≫ 부서 별 0명인 것도 표시해줄 수 있다.
하지만, IS NOT NULL 도 떠올라서 써 보았다 (찐)
≫ IS NOT NULL은 NULL인 것을 지워버리기 때문에 0으로 집계되지 않음
3)
4)
〈내 답〉
나는 CASE를 썼다.
+ 별칭으로 정리도 해 봄ㅋㅎ😁
〈선생님 답〉
선생님은 DECODE를 썼다
5) GROUP BY는 여러 개를 묶어 쓸 수도 있다
💌 HAVING
:: 그룹 함수에 대한 조건 설정
WHERE은 SELECT에 대한 조건식
HAVING은 그룹 함수에 대한 조건식
위는 SALARY에 대한 조건이지만
아래는 AVG(SALARY)에 대한 조건이므로
HAVING절로 조건을 만들어줘야 한다.
문제 풀어보기
≫ SUM(SALARY)에 조건이 걸려있기 때문에 (9000000 초과)
HAVING절을 이용해서 그룹 함수에 조건을 만들어 줘야 한다.
ROLLUP / CUBE
ROLLUP과 CUBE를 써 보았다.
1)
잡 코드마다 그룹 별로 계산을 하되,
마지막에 한 번 더 집계를 더해주는 코드.
2)
ROLLUP과 달리 맨 첫 줄에 합계가 출력됐다.
비슷한 것 같지만 둘의 차이는 뭘까?
① ROLLUP
:: ROLL UP의 특징 : 그룹 별로 중간 집계 처리, 인자로 전달 받은 그룹 중 제일 먼저 지정한 그룹에 대한 중간 집계 진행
// 몇 개를 집어넣든 상관 없이 맨 처음 넣은 인자를 기준으로 중간 집계를 진행한다. (아래에서는 DEPT_CODE)
출력된 결과의 의미 (엑셀로 확인해보기)
빨강 : D1에 있는 J6, J7 결과의 합
주황 : D2에 있는 J4 결과의 합
노랑 : D5에 있는 J3, J5, J7 결과의 합
…
보라 : DEPT_CODE가 NULL인 J6, J7 결과의 합
맨 마지막 핑크 : 총 합
② CUBE
일반 웹 개발에서는 많이 쓰이진 않음 (회계 처리 시 사용)
🙄 SET OPERATION
UNION | 합집합 A∪B | OR |
INTERSECT | 교집합 A ∩ B | AND |
MINUS | 차집합 A - B | |
UNION ALL (UNION + INTERSECT) |
합집합 + 교집합 : 중복되는 값이 나오는 걸 확인할 수 있음 (합집합 + 교집합) |
UNION
:: 합집합 A∪B
UNION은 OR의 개념을 가지고 있다.
+)
+)
▼ 이 경우로 아래에서
INTERSECT, MINUS, UNION ALL을 살펴보자!
INTERSECT
MINUS
≫ 순수하게 앞의 DEPT_CODE에만 속하는 것들.
UNION ALL
≫ 중복 체크 하지 않아 겹치는 것도 그대로 나온다.