본문 바로가기
프로그래밍/데이터베이스

[SQL 기초 - 17장] 오라클 SQL rollup(2), 확장된 GROUP BY, 서브쿼리 응용

by 잡학다방 2024. 12. 26.
반응형

안녕하세요!

오늘은 지난시간에 이어서 ROLLUP

CUBE, GROUPING SETS 에 대해서 알아보려고 합니다.

지난 시간 내용이 기억나지 않는분들은 복습을 하고 오시길 바랍니다!

오늘은 지난 번에 배웠던 ROLLUPGROUPING 함수를 바탕으로

문제를 풀어보도록 하겠습니다.

위와 같은 결과를 조회하기 위해서는 어떻게 해야 할까요?

지난 번에 봤던 결과와는 조금 다르네요

지난번에는 NVL 을 이용해서 위의 '총' 부분을 '총계'로 표현을 했고

'소계'와 '계'는 null 이었는데요,

오늘은 나머지 null 들을 저렇게 '소계'와 '계'로 바꿔 주셔야 합니다.

네 이렇게 결과를 조회하고 끝났었네요.

GROUPING 함수를 보면 조금 감이 오시나요?

GROUPING 함수를 이용해서 뭔가 값을 바꿀 수 있을것 같습니다.

위와 같이 작성 해주셨다면 정답입니다!

물론 다르게 작성 하셨을 수도 있습니다.

사람마다 코딩하는게 다르니까요.

일단 제가 짠 쿼리를 설명드리자면,

저는 DECODE 를 이용해줬습니다.

어제는 NVL 을 사용했는데

그것은 null 값이 데이터가 비어있는 것인지,

아니면 정말 데이터 자체가 null 인지 알 수 없기 때문에

우리는 GROUPING 함수를 이용해야 합니다.

GROUPING 함수 두개를 이용해서 더한 값이 2,1,0 일때로 나누어

DECODE로 표현 했습니다.

두번째 줄의 deptno 는 숫자 형식이지만

결과값이 문자형식이기 때문에 하나로 통일을 해야해서 TO_CHAR 를 붙여줬습니다.

조금 감이 잡히시나요?

그럼 다음 문제 하나 더 풀어볼게요.

위와 같은 결과를 조회하려면 어떻게 해야 할까요?

emp 테이블에는 없는 dname 컬럼이 보이네요

그럼 emp와 dept 테이블 둘 다 이용해야겠죠?

쿼리는 위 처럼 작성해주시면 될 것 같아요.

emp와 dept 테이블을 deptno 로 조인한 다음에

dname 과 job 으로 ROLLUP 해주시면 될 것 같네요.

마지막으로 dname 으로 오름차순 하고,

job 컬럼에 null이 가장 위로 올라와 있으니 내림차순 하면 됩니다!

확장된 GROUP BY

다음은 확장된 GROUP BY 에 대해 알아보도록 하겠습니다.

우리가 배운 ROLLUP 말고

GROUPING SETSCUBE 가 있습니다.

잠시 ROLLUP 의 특징을 떠올려보면

컬럼 기술의 순서에 영향을 받았었습니다.

그에 반면, GROUPING SETS

컬럼 기술의 순서에 영향을 받지 않습니다.

CUBECUBE 절에 나열한 모든 가능한 조합으로

서브그룹을 생성하는 것입니다.

그럼 하나씩 다시 살펴볼게요.

GROUPING SETS 을 사용해서 작성한 쿼리와

조회한 결과입니다.

쿼리를 해석해보면

먼저 GROUP BY job 을 실행하고

GROUP BY deptno 를 실행해서 붙인 다는 느낌입니다.

아까 말했듯이 GROUPING SETS

컬럼 기술 순서에 영향을 받지 않기 때문에

따로 조회해서 합친다는 느낌이 강합니다.

그래서 위의 쿼리를 다른 방법으로 작성해보면

이렇게 작성할 수 있습니다.

지난번에 배웠던 집합 연산을 통해서

하나씩 따로 GROUP BY 한 결과를 합치는 것입니다.

GROUPING SETS 이해가 되셨나요?

CUBE​

다음은 CUBE 입니다.

CUBE 는 사실상 ROLLUPGROUPING SETS 만큼

많이 쓰이지는 않습니다.

그래도 개념은 알고 넘어가야겠죠?

CUBE 는 아까 말씀드렸듯이

CUBE 절에 나열한 모든 가능한 조합으로 서브그룹을 생성하는 것입니다.

예를 들어 위와 같이 CUBE 가 작성되었다고 생각해보면

이렇게 나눠서 생각할 수 있습니다.

이게 모든 경우의 조합으로 서브그룹을 생성하는 것이죠.

(마지막에 '' 는 총계를 나타내기 위한 경우 입니다.)

CUBE를 보도록 할게요.

위의 쿼리에서 GROUPING 함수만 빼면 아래의 결과인데요

분석을 해 놓은 것입니다.

(GROUPING 함수를 넣은 채로 결과를 보시면 더 확실하게 이해가 될 수도 있어요!)

CUBE는 저렇게 모든 가능한 조합으로 서브그룹을 생성하다보니

행의 수가 많아져서 잘 사용하지 않습니다.

가능한 서브그룹은 2^기술한컬럼개수 만큼 생성됩니다.

그럼 컬럼이 저기에서 하나만 늘어나도 8개의 조합이 되겠죠?

그 뒤로는 점점 더 많아지므로

기술 컬럼이 많아진다면 사용하기 좋지는 않겠습니다.

서브쿼리 ADVANCED

마지막은 서브쿼리 응용입니다.

전에 우리는 데이터를 업데이트 하기 위해서 하나씩 입력을 했습니다.

하지만 오늘은 서브쿼리를 사용해서 여러행을 업데이트하는 방법을 알아보겠습니다.

그러기 전에 먼저 위 처럼 준비를 해주세요!

위의 순서대로 잘 따라오셨다면 emp_test 테이블에는

위와 같은 데이터들이 저장되어 있을겁니다.

여기서 우리는 저기 비어있는 dname 컬럼의 데이터를 채울거에요.

dept 테이블에서 데이터를 가져올겁니다.

UPDATE 쿼리 기억 하시나요?

SET 뒤에 컬럼명을 적어주고

그 다음에 업데이트할 데이터를 적어주었죠.

근데 WHERE 절이 없다는것은?

모든 행에 대해서 업데이트를 한다는 말입니다.

그리고 나서 어떤 데이터를 업데이트 할 것인지를

서브쿼리로 작성해 주는것입니다.

emp_test 테이블의 deptno 와 dept 테이블의 deptno 를 비교해서

같은 deptno 에 dept 테이블의 dname 데이터를

emp_test 테이블의 dname 컬럼에 업데이트 해주는 쿼리 입니다.

(말로 보면 어렵지만 차근차근 읽어보세요..!!)

오늘은 GROUP BY 의 종류들과 확장된 GROUP BY,

서브쿼리 응용을 알아봤습니다.

다음시간에 서브쿼리 응용 몇가지 더 할 예정이에요!

오늘도 끝까지 봐주셔서 감사합니다!

오늘은 여기서 마치도록 할게요!

 
반응형