본문으로 바로가기

[Oracle]SELECT 합치기-유니온(UNION,UNION ALL)

category DB\SQL 2019. 3. 13. 23:16

조회한 다수의 SELECT 문을 하나로 합치고싶을때 유니온(UNION) 을 사용 할 수 있습니다.


UNION 은 결과를 합칠때 중복되는 행은 하나만 표시해줍니다.


UNION ALL 은 중복제거를 하지 않고 모두 합쳐서 보여줍니다.



UNION


두개의 SELECT 결과를 합칠수 있습니다.  합친 결과에서 중복되는 행은 하나만 표시합니다.


단, 컬럼의 개수가 같아야하고, 각 컬럼의 데이터타입이 같아야합니다.


사용법


SELECT * FROM A

UNION  (ALL)      

SELECT * FROM B



기본테이블인 COUNTRIES테이블과 REGION 테이블을 UNION 해보겠습니다.


두개의 테이블을 UNION 하기위한 조건으로 컬럼의 갯수와, 타입이 같아야합니다.


때문에 COUNTRIES에서는 COUNTRY_NAME 과 REGION_ID 를 SELECT 하고, 


REGIONS 테이블은 REGION_NAME 과 REGION_ID를 조회하겠습니다.

SELECT COUNTRY_NAME, REGION_ID FROM COUNTRIES
 
UNION
 
SELECT REGION_NAME, REGION_ID FROM REGIONS
cs

두개의 SELECT 가 합쳐져 하나의 결과를 도출했습니다.




또한, UNION 은 중복을 허용하지 않습니다.


따라서 아래와같이 중복이된 데이터가있으면 중복을 제거하여줍니다.


SELECT COUNTRY_NAME FROM COUNTRIES WHERE REGION_ID IN (1,2)
cs


SELECT COUNTRY_NAME FROM COUNTRIES WHERE REGION_ID IN (2,3)
cs


위 두개의 조회결과를 UNION하게되면 

SELECT COUNTRY_NAME FROM COUNTRIES WHERE REGION_ID IN (1,2)
 
UNION
 
SELECT COUNTRY_NAME FROM COUNTRIES WHERE REGION_ID IN (2,3)
cs


중복이 제거되어 나옵니다.



UNION ALL


UNION ALL 은 중복을 제거하지 않습니다.


위 두개의 SELECT 를 UNION ALL 하면

SELECT COUNTRY_NAME FROM COUNTRIES WHERE REGION_ID IN (1,2)
 
UNION ALL
 
SELECT COUNTRY_NAME FROM COUNTRIES WHERE REGION_ID IN (2,3)
cs

중복된 결과도 포함시킵니다.


댓글을 달아 주세요

  1. BlogIcon 불직구 2019.06.18 17:13 신고

    자~알 보고 갑니다

  2. 태기 2020.05.01 23:08

    유니온으로 이것저것 시도해보니 새로운 사실을 알았습니다.
    1. 컬럼수가 일치해야 union이 가능
    2. 컬럼명이 달라도 union이 가능하나 첫번째 테이블 컬럼기준으로 결과값 출력 즉 쿼리문에서 union 뒤에 온 두번재 테이블의 컬럼명은 출력안됨

    알아낸것과는 별개로 이것저것 하다가 문득 의문이 생깁니다
    1. union이 끝난 전체테이블에 조건을 줄수 없는것인가요?
    2. orderby를 사용할 수 없던데 왜 사용이 안될까? 생각해보다가 쿼리순서가 웬만하면 order문이 제일 마지막에 실행된다고 생각했었는데 union이 orderby보다 더 뒤에 실행되는건가요?

  3. BlogIcon 코딩병원 2020.09.09 11:24 신고

    잘 보고 갑니다