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

SELECT문을 실행하면 데이터가 조회됩니다. 만약 이렇게 조회한 여러개의 SELECT문을 가지고 데이터를 가공하고 싶다면 집합연산자를 사용하시면 됩니다. 집합연산자는 SELECT문 활용하여 조회한 데이터를 연산하는 연산자이며 우리가 어릴적 배웠던 그 집합과 동일합니다. 집합 연산자에는 UNION, UNION ALL, INTERSECT, MINUS가 있는데 이번 포스팅에서는 복수의SELECT문을 합쳐주는 UNION, UNION ALL에 대해 포스팅해보려 합니다.

 

합집합 UNION (중복제거)

UNION

두개의 SELECT문을 서로 합치고 싶은데 그 중에서도 두개의 조회문의 중복되는 데이터를 한번만 출력하고 싶다면 UNION을 사용하시면 됩니다. UNION은 합집합을 의미하며 사용하게되면 두개의 SELECT문을 서로 합친 결과를 출력합니다. (중복데이터는 한번만 조회)

 

샘플데이터

위와 같은 데이터를 가진 UNIVERSITY1 / UNIVERSITY2 라는 테이블이 있습니다. 

만약 위 두개의 대학의 모든 학과를 조회하고 싶다고 가정해보겠습니다. 이럴 경우 집합연산자인 UNION을 사용하시면 됩니다. 집합연산자를 사용하기 위해서는 SELECT문의 컬럼명칭, 컬럼위치, 컬럼수가 동일해야합니다. 그렇지 않다면 "ORA-01789: 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다." 라는 에러가 발생합니다. 만약 컬럼명이 같지 않다면 ALIOS를 활용하여 억지로라도 같게 만들어주셔야 합니다.

SELECT DEPARTMENT FROM UNIVERSITY1 --첫번째 SELECT문

UNION

SELECT DEPARTMENT FROM  UNIVERSITY2 --두번째 SELECT문

UNION결과

UNION을 사용하여 두개의 결과쿼리를 하나의 데이터 집합으로 반환했습니다. UNION절에서는 정렬을 사용하지 않는다면 첫번째 SELECT문이 위로오고 첫번째 SELECT문이 밑으로 가서 붙습니다. 서울대학교에 15개의 학과가 있고 부산대학교에 14개의 학과가있지만 총 데이터가 20개만 조회된것은 두개의 대학의 중복되는 데이터를 한번만 조회했기때문입니다. 만약 중복데이터를 모두 조회하고싶다면 UNION ALL을 사용하셔야 합니다.

 

합집합 UNION ALL (중복제거 X)

UNION ALL

그냥 두개의 SELECT문 그 자체를 합치고 싶다면 UNION ALL을 사용하시면 됩니다. UNION ALL을 사용하게되면 위의 그림과 같이 두개의 SELECT문이 하나로 합쳐져 반환됩니다.

SELECT DEPARTMENT FROM UNIVERSITY1 --첫번째 SELECT문

UNION ALL

SELECT DEPARTMENT FROM  UNIVERSITY2 --두번째 SELECT문

UNION ALL 결과

UNION ALL을 사용하여 두개의 SELECT문을 이어붙였습니다. UNION ALL은 조회 순서대로 출력됩니다. UNION과는 반대로 정렬을 하지 않으면 첫번째 SELECT문의 데이터에 두번째 SELECT문이 밑으로 붙습니다. 서울대학교에 15개의 학과가 있고 부산대학교에 14개의 학과가있고 중복데이터를 제거하지 않았으므로 29개가 그대로 출력됩니다.

 

UNION ALL 정렬(ORDER BY) 하는법

UNION은 결과값을 자동으로 정렬한 후 반환합니다. 하지만 UNION ALL은 정렬을 하지 않고 반환하는데요. 여기서 주의할점이 집합연산자로 SELECT문을 연결할때에는 맨 마지막에 연결한 SELECT문에만 정렬(ORDER BY)가 가능합니다. 그렇지 않다면 "ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다." 라는 에러메시지가 출력됩니다.

SELECT DEPARTMENT FROM UNIVERSITY1 --첫번째 SELECT문

UNION ALL
    
SELECT DEPARTMENT FROM  UNIVERSITY2 ORDER BY DEPARTMENT --두번째 SELECT문

위와 같이 마지막 SELECT문에 정렬을 넣으면 정렬된 결과값을 얻을 수 있습니다.

 

[Oracle] 여러개의 SELECT문 중복된 값 제거 MINUS (차집합)

[Oracle] 여러개의 SELECT문 중복된 데이터만 추출하기 INTERSECT (교집합)

 

댓글

Designed by JB FACTORY