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

[SQL 기초 - 6장] DECODE, 그룹함수(GROUP BY, HAVING 절)

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

안녕하세요!

오늘은 지난번에 배운 CASE에 이어 다른 조건문인 DECODE와 그룹함수를 가져왔습니다.

DECODE

먼저 DECODE에 대해서 알아볼게요!!

DECODE 는 CASE와 비슷하게 조건에 따라 반환 값이 달라지는 함수입니다.

DECODE의 문법은

DECODE(기준값[col|expression], 비교값1, 반환값1, 비교값2, 반환값2, 비교값3, 반환값3,...

옵션[기준값이 비교값중에 일치하는 값이 없을 때 기본적으로 반활할 값]

이렇게 쓸 수 있습니다.

SQL에서 써보면

이렇게 쓸 수 있겠죠?

이해하기 쉽도록 자바에서처럼 써보면

이렇게 쓸 수 있겠네요 ㅎㅎ

그럼 지난시간에 CASE 구문으로 작성했던 문제를 DECODE 구문으로 작성 해볼까요?

 

아 그 전에 지난 시간 내용이 기억나지 않거나

보지 못하신 분들은 다시 한 번 보고오시길 바랍니다~!

 

문제를 다시 말씀드리면

emp 테이블을 이용하여 deptno에 따라 부서명으로 변경해서 다음과 같이 조회되는

쿼리를 작성하는 것 입니다.

10 => 'ACCOUNTING'

20 => 'RESEARCH'

30 => 'SALES'

40 => 'OPERATIONS'

그 외 => 'ETC'

DECODE 구문으로 작성

위와 같이 쓸 수 있겠습니다.

우리는 부서 번호를 기준으로 비교할 것이기 때문에

기준값에 deptno를, 그리고 비교값들에 부서번호인 10, 20, 30, 40 을 넣어주고

반환값으로 각각에 해당하는 부서명을 넣어주면 됩니다.

그리고 마지막으로 그 외는 그냥 문자열만 넣어 주시면 되겠네요.

그렇다면 직군에 따라 sal 를 인상하고 싶다면 어떻게 쓰면 될까요?

DECODE 응용

 

위와 같이 써줄 수 있습니다.

기준값으로 job을 넣어주고 비교값으로 직군을 넣어준다음

반환값에 sal 와 인상률을 곱해주면 되겠죠?

문제

그럼 문제를 하나 풀어볼게요.

위의 예시처럼 job에 따라 sal를 인상하려고 합니다.

단, 추가조건으로 job이 MANAGER 이면서 소속부서(deptno)가 30이면 50%를 인상해준다고 합니다.

어떻게 작성하면 될까요?!

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

CASE 문제

위 처럼 AND 연산자를 사용해서 조건을 작성하면 되겠습니다.

단, 여기서 주의할 점은 첫번째 WHEN 절이 세번째 WHEN절 보다 아래에 있으면 안됩니다.

제가 SQL의 CASE 구문을 JAVA의 IF 문으로 많이 설명을 했죠?

IF 문과 비슷하게 생각하시면 됩니다.

첫번째 WHEN 절이 세번째 WHEN 절보다 아래로 가게되면 직군이 MANAGER 인 모든 사원의 sal가

10%만 인상되는 결과가 조회됩니다.

SQL을 작성할 때 순서가 중요하다는점 기억해주세요!!

 

자 그럼 위의 문제를 DECODE로 풀어볼까요?

힌트를 드리자면 DECODE는 중첩할 수 있습니다!

 

DECODE 중첩

위와 같이 써주시면 되겠네요 ㅎㅎ

DECODE 첫번째 줄에서 기준값을 job 으로 놓고 비교값을 MANAGER 로 놓으면

반환값은 다시 한 번 DECODE가 됩니다.

그 안에서 deptno가 30이냐 아니냐를 판가름하여 인상률이 결정 되겠네요.

이와 같이 CASE와 DECODE 조건문은 중첩이 가능하다는점도 기억해주세요!

 그룹함수

그룹함수란?

다음으로 그룹함수에 대해서 알아보겠습니다!

그룹함수에는 크게 5가지가 있는데요

SUM : 합계

COUNT : 행의 수

AVG : 평균

MAX : 그룹에서 가장 큰 값

MIN : 그룹에서 가장 작은 값

이렇게 나눌 수 있겠네요.

쿼리는 GROUP BY 절과 같이 설명을 하겠습니다.

그럼 먼저 문법을 살펴보자면

 

위와 같이 그룹함수는 GROUP BY 절과 함께 쓸 수 있으며

GROUP BY절에 쓰여진 기준들은 SELECT 절에도 쓰여져야 합니다.

그럼 예시로 하나 작성해보겠습니다.

1. 부서번호별 sal 컬럼의 합

2. 부서번호별 가장 큰 급여를 받는 사람의 급여액수

3. 부서번호별 가장 작은 급여를 받는 사람의 급여액수

4. 부서번호별 급여 평균 액수

5. 부서번호별 급여가 존재하는 사람의 수(sal 컬럼이 null이 아닌 행의 수)

그룹함수와 GROUP BY절의 사용

 

비교하기 편하게 emp 기본테이블과 함께 올려드렸습니다.

위 쿼리의 결과를 보시면 부서번호 별로 결과가 나온 것을 볼 수 있습니다.

만약에 GROUP BY 절이 없다면 그냥 부서별이 아닌 전체 사원들의

sal 합계, sal MAX, sal MIN, sal AVG 값들이 하나의 행으로 나오겠죠?

그룹함수의 특징

그러면 그룹함수의 특징에 대해서 알아보도록 하겠습니다.

1. null 값을 무시한다.

그룹함수 특징1

 

위의 emp 기본 테이블을 보시면 30번 부서의 사원 6명 중 2명은 comm값이 null 인데

결과는 숫자로 나오죠?

제가 지난번에 null 에 어떤 숫자를 더하거나 빼도 null 이라고 했는데 말이죠

이를 보시면 null 값이 무시된 것을 알 수 있습니다.

2. SELECT 절에 기술되는 일반 컬럼들은 (그룹 함수를 적용하지 않은) 반드시

GROUP BY 절에 기술 되어야 한다.

* 단, 그룹핑에 영향을 주지 않는 고정된 상수, 함수는 기술하는 것이 가능하다.

그룹함수 특징2

 

2번의 특징은 위와 같이 작성해도 된다는 말입니다.

3. 그룹함수는 WHERE 절에서 사용하는게 불가능 하지만, HAVING 절에 기술하여 동일한 결과를 나타낼 수 있다.

그룹함수 특징3

 

3번의 특징은 위의 사진에 설명한대로 그룹함수를 사용할 때

조건을 WHERE 절이 아닌 HAVING 절에 사용해야 함을 보여주고 있습니다.

 

그렇다면 HAVING 절 없이 조건절을 작성하는 방법은 없을까요??

있습니다!

위의 사진에서 두번째 쿼리를 HAVING 절 없이 작성해 봅시다.

HAVING 절 없이 조건절 구현

 

지난번에 배웠던 IN-LINE VIEW 를 기억하시나요?

그룹함수와 WHERE 절을 함께 쓸 수 없으므로

GROUP BY가 들어간 SELECT 구문을 IN-LINE VIEW 로 작성하여 별칭을 부여하고

그 별칭을 WHERE 절에 적용하시면 됩니다!!!

응용력을 키웁시다!!!

네 오늘은 이렇게 조건문의 일부인 DECODE 와

그룹함수에 대해서 배워보았는데요 설명이 이해가 되시나요?

이해가 되지 않으신 부분은 댓글을 달아주세요!

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

다음에 더 좋은 내용 가져올게요~~

 

#그룹함수#sql#sqldeveloper#where#select#from#groupby#max#min#decode#case#if#java#it#sum#avg

반응형