본문 바로가기

Data_Analysis_Track_33/SQL

SQL_09(집합 연산자(union, union all)

/* ****************************************************
집합 연산자 (결합 쿼리)
- 둘 이상의 select 결과를 합치는 연산
- 구문
 select문  집합연산자 select문 [집합연산자 select문 ...] [order by 정렬컬럼 정렬방식]

-연산자
  - UNION: 두 select 결과를 하나로 결합한다. 단 중복되는 행은 제거한다. 
  - UNION ALL : 두 select 결과를 하나로 결합한다. 중복되는 행을 포함한다. 
   
 - 규칙
  - 연산대상 select 문의 컬럼 수가 같아야 한다. 
  - 연산대상 select 문의 컬럼의 타입이 같아야 한다.
  - 연산 결과의 컬럼이름은 첫번째 select문의 것을 따른다.
  - order by 절은 구문의 마지막에 넣을 수 있다.
*******************************************************/



-- emp 테이블의 salary 최대값와 salary 최소값, salary 평균값 조회
select max(salary), min(salary), avg(salary) from emp;

select '최대값' as 'Label', max(salary) as '집계결과' from emp
union
select '최소값', min(salary) from emp
union
select '평균값', round(avg(salary), 2) from emp;

-- full outer join 정의
-- from A full join B on 조건 -> mysql에서는 구현 불가
-- 양쪽에 중복된게 없다는 것이 확실하거나 중복되도 상관없다면 union all 사용 -> 처리속도가 빠르기 때문이다.

select * from emp e left join dept d on e.dept_id = d.dept_id
union
select * from emp e right join dept d on e.dept_id = d.dept_id
order by salary desc;

-- with rollup

select dept_id, sum(salary) as '급여합계'
from emp
group by dept_id with rollup;
-- 위, 아래 둘다 같은 결과값이 나온다.
select dept_id, sum(salary) as '급여합계'
from emp
group by dept_id
union all
select '총합계', sum(salary) from emp;