KH

230309 (GROUP BY_HAVING)

十月 2023. 3. 9. 17:03

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로 묶어주겠다는 것

≫ 각 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 WHEN 조건식 THEN 결과값

나는 CASE를 썼다.

 

+ 별칭으로 정리도 해 봄ㅋㅎ😁

〈선생님 답〉

DECODE(SUBSTR(EMP_NO, 8, 1))에서 1은 '남 / 2는 '여'가 된다

선생님은 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

'D5'이면서 3000000 초과인 것들을 뺀 것임

≫ 순수하게 앞의 DEPT_CODE에만 속하는 것들.

 

UNION ALL

≫ 중복 체크 하지 않아 겹치는 것도 그대로 나온다.