집합 연산자는 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;
'개념정복💫 > 오라클 ORACLE 정복' 카테고리의 다른 글
[ORACLE] 서브쿼리(스칼라, 인라인, 중첩 서브쿼리) (0) | 2023.09.11 |
---|