개발 수업/DB
[Oracle/SQL] 그룹쿼리와 집합연산자
오늘 하루s
2023. 6. 8. 19:04
728x90
더보기
Day28-3. 230608
집계함수
대상 데이터를 특정 그룹으로 묶은 다음 이 그룹에 대해 총합, 평균, 최댓값, 최솟값 등을 구하는 함수
coun(*) : null 포함한 수
coun(컬럼명) : null제외 수
-- 전체 사원수, 최고급여, 최저급여, 평균급여, 총급여
select count(empno),max(sal),min(sal),avg(sal),sum(sal)
from emp;
-- 업무별 사원수, 최고급여, 최저급여, 평균급여, 총급여
select job,count(empno) , max(sal) , min(sal) , avg(sal) , sum(sal)
from emp
group by job
order by max(sal) desc;
GROUP BY절과 HAVING절
group by : 그룹으로 묶을 컬럼명이나 표현식을 group by절에 명시해서 사용
where와 order by절 사이에 위치
-- 업무가 analyst이거나 manager에 한해
-- 업무별 사원수, 최고급여, 최저급여, 평균급여, 총급여
select job,count(empno),max(sal),min(sal),avg(sal),sum(sal)
from emp
where job='ANALYST' or job=UPPER('manager')
group by job
order by max(sal) desc;
having절은 group by절 다음에 위치해 group by한결과를 대상으로 다시 필터를 거는 역할.
select job,count(empno),max(sal),min(sal),avg(sal),sum(sal)
from emp
group by job
having job = 'ANALYST' or job=UPPER('manager')
order by max(sal) desc;
where절은 쿼리 전체에 대한 필터역할,having절은 where조건을 처리한 결과에 대해 group by를 수행 후 산출된 결과에 대해 다시 조건을 걸어 데이터를 걸러냄.->having절이 없는게 더 빠름.
-- 업무별 종사자수가 3명이상이되는 업무종사자수, 최고급여액과 최저급여액의 차를 출력
-- 업무별 종사자수가 많은 업무부터 보여주되
-- 종사자수가 동일하면 간극이 작은 업무부터 출력
select job,count(job),max(sal)-min(sal)
from emp
group by job
having count(job)>=3
order by count(job) desc, max(sal)-min(sal) asc;
결과)
select job,count(job)업무종사자수,max(sal)-min(sal)
from emp
group by job
having count(job)>=3
order by 업무종사자수 desc, 3 asc;
위와 같은 결과
rollup절
rollup()은 ()안에 표현식을 기준으로 집계한 결과, 즉 추가적인 집계 정보를 보여줌.
-- 업무별 사원수
select job,count(empno)
from emp
group by rollup(job);
결과)
cube절
rollup()이 순차적 집계했다면 cube는 명시한 표현식 개수에 따라 가능한 모든 조합별로 집계한 결과를 반환.
-- 업무별 사원수+총사원수
select job,count(empno)
from emp
group by cube(job);
결과)
cube절이 rollup()절보다 더 자세하게 나옴.
집합연산자
합집합 : union, union all
select deptno
from dept
union
select deptno
from emp;
union : 중복되는 것 한번만 출력
select deptno
from dept
union all
select deptno
from emp;
union all : 중복되는 것 모두 출력
교집합 : intersect
select deptno
from dept
intersect
select deptno
from emp;
차집합 : minus
select deptno
from dept
minus
select deptno
from emp;
728x90