[SQL] 06.집합연산자(2023.09.08)

0

집합 연산자 (결합 쿼리)

  • 둘 이상의 select 결과를 합치는 연산

  • 구문
    select문 집합연산자 select문 [집합연산자 select문 ...][order by 정렬컬럼 정렬방식]

  • 컬럼이 3개, 컬럼이 3개있는 행끼리 수직적으로(세로로) 합칠건데
    같은 컬럼이니까 행으로 붙을 수있음

    컬럼의 항목이 같을 필요는 없지만 , type은 같아야함.
    컬럼명이 다를때 앞에 있는 첫번째 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;


각 값을 세로로 합치고 싶음 -> 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;
profile
데이터 분석 & 서비스 기획

0개의 댓글

관련 채용 정보