본문 바로가기
Study/중앙정보처리학원과정

20일차. Group by~Having

by 얏옹이 2022. 11. 21.
반응형

벌써 20일차다. 주말 포함하면 학원에 다니기 시작한지도 이제 한달이 다되간다.

 

오늘 해본 예제와 사용해본 함수를 설명하고자 한다.

 

-distinct

중복되는 데이터값을 한번만 보여준다

EMP 테이블의 deptno를 조회하면 중복되는값이 많다

distinct를 이용하여 중복되는 데이터는 한번만 출력하게 해줄수 있다.

--부서별로 근무하는 사원수, 급여총합, 평균급여를 사원수가 많은 부서부터 출력하라.

 

EMP 테이블의 부서를 나타내는건 DEPTNO가 유일하다. 따라서 DEPTNO를 Group by로 묶어준후 그 수를 count하고

해당 부서들의 급여의 총합, 평균급여를 조회해보았다.

 

 

자. 이렇게 출력했는데 평균급여 란에 소수점이 매우 마음에 들지 않는다.

이럴때 쓰는 숫자 함수가 있다.

 

Ceil() - 숫자 올림 함수

Floor() - 숫자 내림 함수

Round() - 숫자 반올림 함수

 

Round는 (올림or내림or반올림할 값, 올림or내림or반올림할 값 자리수기준) 을 넣어주면 된다.

소수점 첫번째 자리를 defalut로 해서 0으로 기준하고. 소숫점 두번째 자리부터 1, 세번째 자리부터 2 식으로 1씩 증가하고

반대로 일의자리로 가면 -1, 십의 자리로 가면 -2로 증가한다.

 

오라클에서 제공하는 DUMMY 테이블인 Dual 테이블로 테스트 해보겠다.

 

먼저 Ceil

 

 

소수점 첫번쨰 자리에서 올림을 했기때문에 3으로 출력된다

 

다음은 Floor

 

소수점 첫번째 자리에서 내림했기때문에 2라고 표기된다.

 

다음은 Round

 

기준값은 18.835로 주었고 기본값으로 0을 주었다. 이는 소수점 첫번째 자리에서 반올림 하겠다는 뜻이다.

0은 기본값이기때문에 생략도 가능하다.

 

이번엔 1의 자리에서 반올림 해보겠다.

 

-1은 1의 자리를 의미한다. 18에서 8을 반올림했기때문에 20으로 출력된다. 

 

 

다음은 Group by절과 Having을 보겠다. 

 

Group by는 데이터들을 '그룹화' 해준다 

 

Select문에 그룹화 해줄 컬럼명을 명시해주고, Group by 뒤에 같은 컬럼명을 기재해주면 된다.

 

 

이렇게 되어있는 데이터들을 그룹화 해주겠다.

 

deptno 컬럼에 대해서 그룹화를 해주었고. Group BY 절에서는 집계함수가 함께 쓰인다.

 

그리고 이 집계함수때문에 Having을 사용한다고 봐도 무방하다. Where절에는 집계함수가 올수 없기때문에

 

Group By절에서 집계함수를 상당히 많은 빈도로 사용하기때문에, 따라서 조건절을 Where가 아닌 Having을 주로 사용한다. 하지만 무조건 Having을 사용하는것은 아니다. 집계함수가 아닌 별도의 조건인 경우에는 데이터 흐름상 Where절에서 조건을 주고 나서 그룹화 하는것이 좋다.

그리고 Group By와 Having은 한쌍이다. Group by만 단독으로 올수는 있지만, Having은 반드시 Group by와 함께 사용해야 사용 가능하다. Having만 단독으로는 사용이 불가.

 

Group by~ Having 예시를 보겠다.

 

-- 부서별 평균 급여가 2917 이상인 부서번호 사원수 평균급여를 조회하라, 단 평균급여는 소수점 첫번째자리에서 반올림한다.

 

 

일단 조건을 주기 전에 부서번호, 사원수, 평균급여를 반올림 하여 조회해보겠다.

 

 

자 여기서 평균급여가 2917 이상인 부서는 10번부서 뿐이다.

 

Having 조건절을 추가해주겠다.

 

 

2917 이상이기때문에 >= 연산자를 이용해주었다. 평균급여가 2917 이상인 부서는 10번부서 단 한곳이다.

 

 

추가 예제를 살펴보겠다.

 

--같은 업무를 하는사원들의 최저, 최고급여를 조회, 급여를 많이 받는 사원부터 조회한다.

 

 

EMP 테이블에서 업무는 JOB 컬럼에 있다. GROUP BY 절로 job 컬럼을 그룹화 해주고 MIN(최저값), MAX(최고값) 함수를 이용하여 최저. 최고급여를 보여주고 최고급여순으로 내림차순 정렬해주었다

 

--위의 예제에서 추가로 최고급여가 1600~3000인 결과만 출력해보겠다

 

Having과 Between을 이용하여 최고급여가 1600~3000 사이의 결과를 출력했다.

 

 

마지막 예제를 한번 더 살펴보겠다.

 

--10 또는 30 부서에 근무하는 사원수, 최고급여, 최저급여
--최고 급여액과 최저급여액의 차이가 적은부서부터 출력하세요

 

 

여기서는 Having 절을 사용하지 않았다. 조건이 집계함수를 이용하는것이 아닌, Deptno가 30또는 10 즉 or를 사용하기때문에 Having으로 조건을 주어도 결과는 동일하지만, 먼저 조건절을 이용하여 데이터를 1차로 추려낸 후에 그룹화 하는것이 데이터 수행 부분에 있어서는 좀더 효율적이다.

그리고 or절의 반복을 주지 않기 위해 in() 함수를 이용하여 10과 30이 둘다 포함 된 값을 출력해주었다.

 

최고급여액과 최저급여액의 차이는 직관적으로 연산식을 이용하여 MAX(SAL)에서 MIN(SAL)을 빼준값을

오름차순으로 정렬해주는것으로 작성했다.

 

 

 

 

반응형