둘 이상의 select 결과를 합치는 연산
구문
select문 집합연산자 select문 [집합연산자 select문 ...][order by 정렬컬럼 정렬방식]
컬럼이 3개, 컬럼이 3개있는 행끼리 수직적으로(세로로) 합칠건데
같은 컬럼이니까 행으로 붙을 수있음
컬럼의 항목이 같을 필요는 없지만 , type은 같아야함.
컬럼명이 다를때 앞에 있는 첫번째 select문을 따른다.
[order by 정렬컬럼] - 합친 대상을 가지고 마지막에 정렬
-- emp 테이블의 salary 최대값와 salary 최소값, salary 평균값 조회
select max(salary), min(salary), avg(salary) from emp;
각 값을 세로로 합치고 싶음 -> union
select '합계' as "Label", max(salary) as "집계결과" from emp -- 첫번째 select문의 컬럼명
union
select '최소값', min(salary) from emp
union
select '평균', round(avg(salary),2) from emp;
-- 컬럼 값 1개, 실수형 type 일치(컬럼 수, type 일치해야함) -> union사용가능
=> union을 사용해서 라벨과 집계결과 컬럼을 가진 행 3개를 합침. 라벨 컬럼에는 문자열이, 집계결과에는 실수형이 들어온 것 처럼 컬럼 수 와 type을 일치 시켜줘야함
-- full outer join 정의
-- left join과 irght join 했던 값들을join
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;
-- union과 union all : 둘 다 상관 없으면, union all을 하는 것이 좋음(속도 향상). 중복된 것을 걸러내고 싶다면 union
```sql
-- with rollup
select dept_id, sum(salary) as "급여합계"
from emp
group by dept_id
union all
select '총집계', sum(salary) from emp;
with rollup;
-- order by(정렬)는 ucion으로 합치고 나서 마지막에 전체 결과에 대해 실행한다.
select * from emp e left join dept d on e.dept_id = d.dept_id
union all
select * from emp e right join dept d on e.dept_id = d.dept_id
order by salary desc;