본문 바로가기

Oracle/SQL

SQL 집합연산자 UNION ALL ( 데이터중복 합집합)

join 과 집합연산자의 차이점 

  1. join - 데이터를 양 옆으로 연결하여 출력
  2. 집합연산자 - 데이터를 위아래로 연결해서 출력

위아래로 연결할때 지켜주어야 할 조건

  1. 위쪽 쿼리문의 컬럼의 갯수와 아랫쪽 쿼리의 컬럼의 갯수가 동일해야한다.
  2. 위쪽 쿼리문의 컬럼의 데이터 타입과 아래쪽 쿼리문의 컬럼의 데이터 타입이 동일해야한다.
  3. 결과로 출력되는 컬럼명은 위쪽 쿼리의 컬럼명으로 출력 된다.
  4. order by 절은 맨 마지막 쿼리문 아래쪽에만 작성할 수 있습니다.

UNION ALL 과 UNION 의 차이점

만약 A = {1,2,3,4,5}, B = {3,4,5,6,7} 이라면 UNION ALL

A + B = {1,2,3,4,5}+{3,4,5,6,7,} 이런식으로 중복데이터들도 다 함께 출력된다.

그래서 데이터들의 타입이 동일 해야 출력이 된다는 의미이다.

실행속도는 union all 이 조금 더 빠르다.


예제 67 deptno 별 총월급과, deptno 를 출력하고, union 을 사용하여, 그 밑에 월급 총 합계를 출력하여라

select deptno , sum(sal) 
from emp 
group by deptno

union all

select to_number(null)as deptno, sum(sal) 
from emp;

위아래 쿼리끼리 컬럼의 갯수나, 데이터가 같아야하기때문에

총합계에 열에 null 이 나와야하므로 null 이라 작성하고 데이터 타입을 to_number 로 위에있는 쿼리의 데이터타입을 맞추어 준다.

그리고 마지막으로 별칭도 deptno 로 동일하게 해 주면 좋다. (안해도 나옴)

해당 쿼리문의 같은 결과값은 

select deptno, sum(sal)
from emp
group by rollup (deptno);

rollup 집계를 사용한것과 결과 가 같다. 


문제 319 : union all 이용해서 데이터를 위아래로 연결해서 출력,

삶의 주관적 만족도가 남자의 데이터와 여자의 데이터를 다음과 같이 위아래로 연결하여 출력

select feature2, extr_satifi + few_satifi as 만족도, 
       rank () over( order by extr_satifi + few_satifi desc) 순위
from satisfy_table 
where feature1 = '연령*성별' and feature2 like '%남자%'

unionall

select feature2, extr_satifi + few_satifi as 만족도, 
       rank() over (oredr by extr_satifi + few_satifi desc) as 순위
from satisfy_table
where feature1 = '연령*성별' and feature2 like '%여자%' 
order by 3 desc ;

 

select 절의 feature2 의 데이터 타입이 모두 문자,

 extr_satifi + few_satifi as 만족도는 숫자 ,

 rank () over (order by extr_satifi + few_satifi desc)  순위 는 숫자. 

order by 절은 두번째 쿼리문 맨 마지막에만 작성 , 중간에 입력할 수 없다.


문제 320 : 혼인상태에 대한 만족도 순위와 경제활동상태에 대한 만족도와 순위쿼리문의 결과를위아래로 연결해서 출력

select feature2, extr_satifi + few_satifi as 만족도,
       rank() over ( order by extr_satifi + few_satifi desc) 순위 
from satisfy_table 
where feature1 = '혼인상태'

union all

select feature2, extr_satifi + few_satifi as 만족도, 
       rank() over ( order by extr_satifi + few_satifi desc) 순위 
from satisfy_table 
where feature1 = '경제활동상태'
order by 3 asc;

문제 322 rollup 을 사용한  SQL 을 UNION ALL 로 출력하시오

select job, sum(sal) 
from emp 
group by rollup(job);

—> order by 안써도 정렬됐음

select job, sum(sal)
from emp
group by  job

union all

select to_char(null)as job, sum(sal)
from emp
order by 1 asc;

 

첫번째 컬럼인 job 과 데이터 타입을 맞추어 주기 위해 두번째 컬럼의 null 을 to_char 로 변환해 주었다.

**** union all 은 현업에서 잘 안쓴다. (emp table 을 두번이나쓰기때문에)

rollup 을 더많이씀.

문제 323 : cube 로 작성한 것을 union all 로 바꾸시오

select to_char(hiredate, 'RRRR') , sum(sal) 
from emp 
group by cube(to_char(hiredate, 'RRRR'));

select to_char(hiredate, 'RRRR') as 입사년도, sum(sal)
from emp
group by to_char(hiredate, 'RRRR')

union all

select to_char (null)as 입사년도, sum(sal)
from emp
order by 1 asc nulls first;

order by 절은 맨아래의 쿼리문에만 사용가능, order by 입사한년도 asc nulls first 는 입사한년도를 asc 하게 정렬하고 null 값은 맨위로 출력하겠다는뜻