[PostgreSQL] 21~30강까지의 내용 정리

bacccine·2022년 3월 10일
0

PostgreSQL

목록 보기
5/9

그룹 함수부터 Cube 절까지

Q. emp 테이블에서 같은 부서 내 본인보다 높은 연봉을 받는 동료직원의 이름,부서번호,연봉 출력하기
A.

select e1.name as 직원이름, e1.sal as 직원연봉, e2.name as 동료이름,e2.sal as 동료연봉 
from emp2 e1 join emp2 e2 
on e1.deptno=e2.deptno and e1.sal < e2.sal;

그룹 함수

-함수의 분류
(1) 단일행 함수: 하나의 행이 삽입되면 하나의 결과가 리턴
(2) 복수행 함수(그룹 함수): 여러 개의 행이 삽입되면 하나의 결과가 리턴

-count 함수는 NULL은 세지 않음. 숫자,문자, 날짜 컬럼 모두 센다
-sum, avg 함수는 NULL은 무시하며 숫자 컬럼만 연산 가능
-avg 함수 주의 사항) NULL을 포함한 평균을 구하는 경우 NULL 대상은 아예 연산 대상에서 제외가 된다
ex. 총 10명이고 NULL이 5명이라면 avg함수는 5명의 평균값을 출력하기 때문에 sum(컬럼명)/count(*)의 값(전체 평균)과 값이 달라진다

-round() 함수는 반올림

GROUP BY

-6개의 구문 중 4번째 위치
select>from>where>group by>having>order by

-group by에서 만약 같은 그룹으로 묶일 때 더 세분화하여 매핑하고 싶다면 group by d, p; 처럼 하나의 조건을 더 준다
-group by 절에 나열된 컬럼 이외의 컬럼은 select 절에 단독으로 사용할 수 없다
∵ 그룹의 개수와 일치하지 않기 때문에, group by로 인해 축약되었기 때문에 개수가 일치하지 않는다

HAVING 절

-group by 절 뒤에 사용, group by 연산 결과의 추가 조건 전달 시 사용
-where 절은 그룹 함수 조건 사용 불가
-일반, 그룹 조건을 전달하는 역할 수행
-일반 조건의 경우 where/having 모두 사용 가능하나, where절 사용이 유리

Grouping Set 절

-group by 절과 함께 사용
-여러 형태의 그룹 정보를 동시 전달 가능
-group by 결과의 결합, 각 연산 결과를 하나로 나타내고 싶을 때 사용
-각각의 그룹핑 데이터를 union으로 결합한 것으로 표현
-그룹 level을 직접 전달
-컬럼 순서가 달라져도 동일한 데이터 셋이 출력된다

-사용자가 나열한 수 만큼의 그룹 연산 결과를 동시에 출력

예시

select deptno,position,max(sal) from emp2
group by grouping sets(deptno,position,());

//여기서 ()는 전체를 의미

Q. student 테이블에서 각 학년별 키의 평균, 학과별 키의 평균, 학년과 학과별 키의 평균, 전체 키의 평균을 출력
A.

select avg(height) from student
group by grouping sets(grade,deptno,(grade,deptno),());

Rollup 절

-grouping sets와 비슷한 표현식
-group by 절과 함께 사용, group by 결과의 결합
-여러 형태의 그룹 정보를 동시에 전달하는 것이 가능
-grouping sets와는 달리 컬럼끼리의 그룹을 직접 전달할 필요가 없다
-전달된 컬럼을 가지고 발생 가능한 여러 조합을 알아서 출력

-rollup에 나열된 컬럼 순서에 따라 다른 결과가 나온다
-rollup 컬럼 수 + 1개의 레벨(집단) 생성, 나열된 컬럼의 수보다 1개 많은 집단이 출력된다

예시

select deptno,position,sum(sal) from emp2
group by rollup(deptno,position);

//전체 소계를 () 없이 출력한 결과를 얻는다

Cube 절

-group by 절과 함께 사용하며 여러 형태의 그룹 정보를 동시에 전달 가능
-group by 결과의 결합 → grouping set, rollup 과 같은 기능을 수행
-grouping sets와는 달리 묶을 그룹을 직접 전달할 필요가 없다
-컬럼 순서가 변경되어도 동일한 결과
-컬럼 수가 n일 때 2^n 레벨의 소계 출력
-> CUBE(A,B,C)라면 group by A, group by B, group by C, group by A,B group by B,C, group by A,C, group by A,B,C
즉 총 2^3, 8개 출력

-사용자가 원하는 그룹 형태가 정해진 경우 grouping set이 더 직관적이다

0개의 댓글