집합 연산자 (결합 쿼리)

Bleu·2023년 9월 7일

sql

목록 보기
5/7

집합 연산자

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


  • 구문

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

  • 연산자

    • UNION: 두 select 결과를 하나로 결합한다. 단 중복되는 행은 제거 (합집합)
    • UNION ALL : 두 select 결과를 하나로 결합한다. 중복되는 행을 포함 (합집합)
    • INTERSECT: 두 select 결과의 동일한 결과행만 결합 (교집합)
    • MINUS: 왼쪽 조회결과에서 오른쪽 조회결과에 없는 행만 결합 (차집합)

      mysql에서는 INTERSECT 와 MIINUS는 지원하지 않음


  • 규칙

    → 연산대상 select 문의 컬럼 수가 같아야 함
    → 연산대상 select 문의 컬럼의 타입이 같아야 함
    → 연산 결과의 컬럼이름은 첫번째 select문의 것을 따름
    → order by 절은 구문의 마지막에 넣을 수 있음
    → UNION ALL을 제외한 나머지 연산은 중복되는 행은 제거

    ex)

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

-- 이거를 한 행씩 보고싶다면

select max(salary) from emp
union
select min(salary) from emp
union
select round(avg(salary), 2) from emp;

그리고 여기에 이름을 붙여 준다면

select '최댓값' as "label 1", 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 outer join B on 조건
    → mysql은 지원을 하지 않음 => 따라서 left join과 right join 한것을 union을 사용해서 결합한다

ex)

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 all을 사용하는 것이 결과를 보여주는 속도가 더 빠름

order by를 사용하고 싶다면 union 사용 후에 마지막에 추가

0개의 댓글