본문 바로가기
개념정복💫/오라클 ORACLE 정복

[ORACLE] 집합 연산자(UNION, UNION ALL, MINUS, INTERSECT)

by 옹쑥이 2023. 9. 11.

집합 연산자는 SELECT문을 통해 데이터를 조회한 결과를 하나의 집합으로 다룰 수 있다.

또한, 두 개 이상의 SELECT문의 결과 값을 연결할 때 사용하며 총 4가지 종류가 있다.

  • UNION : 결과 값의 중복 제거
  • UNION ALL : 중복된 결과 값도 제거없이 모두 출력
  • MINUS : 차집합. 먼저 작성한 SELECT문의 결과 값에서 다음 SELECT문에 존재하지 않는 데이터만 출력
  • INTERSECT : 교집합. 먼저 작성한 SELECT문과 다음 SELECT문의 결과 값이 같은 데이터만 출력

UNION / UNION ALL

: 두 개의 SELECT문의 결과 값을 연결할 경우, 각 SELECT문이 출력하려는 열 개수와 각 열의 자료형이 순서별로 일치해야 함. 또한, ORDER BY는 맨 마지막에 사용!

 

[실행 코드]

SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10

UNION

SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 20;

[결과 화면]


1) 열 개수가 일치하지 않을 때, null로 값을 임의로 지정하면 UNION 활용 가능

출력 열 개수가 일치하지않거나 출력 열의 자료형이 다를 때, 각각 오류가 발생한다.

ORA-01789: query block has incorrect number of result columns
:  출력 열 개수가 다를 때 발생

ORA-01790: expression must have same datatype as corresponding expression
: 출력 열의 자료형이 다를 때 발생. 해당 경우는 TO_CHAR를 사용하여 해결 가능

 

Ex ) null로 값을 임의로 지정하여 열 개수 일치시키기

 

[실행 코드]

SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10

UNION

SELECT empno, ename, sal
FROM emp
WHERE deptno = 20;

[결과 화면]

 

[해결 코드]

null로 값을 임의로 지정

 

[실행 코드]

SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10

UNION

SELECT empno, ename, sal, null
FROM emp
WHERE deptno = 20;

[결과 화면]

 

2) ORDER BY가 있을 경우에는 맨 마지막에 작성

UNION을 사용했을 때, 하단 두 개의 오류가 발생하는 경우가 있다.

ORA-00933: SQL command not properly ended
:  SQL구문에서 필요한 키워드가 빠져있거나 정확한 순서로 나열되지 않았을 때 발생

ORA-00907: missing right parenthesis
: 쿼리문에서 괄호나 콤마가 빠져서 나는 오류

하지만, 쿼리문을 확인했을 때 각각의 SELECT문이 정상 작동한다면 ORDER BY를 확인해봐야 한다.

ORDER BY가 첫 번째 SELECT문에 작성되어있는 경우 상단 2개의 오류가 발생할 수 있다.

 

Ex 1) ORA-00933: SQL command not properly ended

[실행 코드]

SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10
ORDER BY empno

UNION

SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 20;

[결과 화면]

 

Ex 2) ORA-00907: missing right parenthesis

[실행 코드]

(SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10
ORDER BY empno)

UNION

(SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 20);

[결과 화면]

 

[해결 코드]

(SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10)

UNION

(SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 20)

ORDER BY empno;