집합 연산자(SET OPERATOR)
는 여러 건의 데이터들(집합)을 연산하는것이다.
주요 집합 연산자 4가지
연산자 종류 | 내용 |
---|---|
UNION | 두 집합의 결과를 합쳐서 출력, 중복 값 제거하고 정렬함 |
UNION ALL | 두 집합의 결과를 합쳐서 출력, 중복 값 제거 안하고 정렬 안 함 |
INTERSECT | 두 집합의 교집합 결과를 출력 및 정렬함 |
MINUS | 두 집합의 차집합 결과를 출력 및 정렬함. 쿼리의 순서가 중요함 |
위의 4가지 집합 연산자를 사용할 경우에 주의사항 세 가지
UNION과 UNION ALL 연산자는 두 집합을 더해서 결과를 출력한다. 차이점은
SQL> SELECT studno, name, deptno1, 1
2 FROM student
3 WHERE deptno1 = 101
4 UNION
5 SELECT profno, name, deptno, 2
6 FROM professor
7 WHERE deptno = 101 ;
STUDNO NAME DEPTNO1 1
---------- ---------- ---------- ----------
1001 조인형 101 2
1002 박승곤 101 2
1003 송도권 101 2
9411 서진수 101 1
9511 김신영 101 1
9611 일지매 101 1
9711 이윤나 101 1
UNION
연산자와UNION ALL
연산자를 사용할 때 주의 사항이 있다. 예를들어, 기존에 존재하던 SQL에 검색 조건이 한 가지가 더 추가가 되었다고 가정한다. 그러면 대부분의 경우 기존에 존재하던 SQL에UNION
/UNION ALL
을 사용하여 새로운 SQL을 추가해서 사용하는 경우가 많다. 그런데 이런 방법은 성능에 아주 나쁜 영향을 미친다.즉,
UNION
으로 많이 연결할수록 SQL의 성능은 아주 많이 떨어지게 된다. 그래서 가급적UNION
보다는 뒤에서 배우는DECODE
나CASE
또는 다른 방법들을 사용하여 전체 sql을 간결하게 작성하는 습관을 들여야 한다.
INTERSECT
연산자는 두 집합의 교집합 부분을 찾아내는 집합 연산자이다.
오라클은 교집합을 정렬을 통해 찾게된다. 즉, INTERSECT
연산자는 정렬을 동반하게 되므로 많은 데이터를 대상으로 할 경우 속도가 느려진다.
SELECT studno, name
FROM student
WHERE deptno1 = 101
INTERSECT
SELECT studno, name
FROM student
WHERE deptno2 = 201 ;
MINUS
연산자는 큰 집합에서 작은 집합을 빼는 집합 연산자이다. 사용법이 간단하다. 큰 결과를 가진 SELECT를 먼저 쓰고 MINUS를 쓴 다음 작은 결과를 가진 SELECT를 나중에 쓰면 된다. 한 가지 주의할 점은 마이너스이기 때문에 SELECT문장 쓰는 순서만 조심하면 된다.
SELECT empno, ename, sal
FROM emp
MINUS
SELECT empno, ename, sal
FROM emp
WHERE sal > 2500;
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
7654 MARTIN 1250
7788 SCOTT 23.4
7844 TURNER 1500
7876 ADAMS 1100
7900 JAMES 950
7934 MILLER 1903.33
위의 결과를 보면 MINUS
연산자도 결괏값을 정렬한다. 즉, 데이터 양이 많을 경우 시간이 오래 걸린다. 만약 집합 연산자를 사용할 때 두 개 쿼리의 컬럼의 결과가 다르거나 데이터 형이 다르면 아래와 같은 에러가 발생하게 된다.
ORA-01789: query block has incorrect number of result columns
위 에러는 SELECT절의 컬럼 개수가 다를 경우 발생하는 에러이다.
아래는 SELECT절의 컬럼의 데이터 타입이 다를 경우 발생하는 에러이다.
ORA-01790: expression must have same datatype as corresponding expression