[TIL][SQL] SELECT-08

goaswon·2020년 10월 29일
0

SQL

목록 보기
10/10

집합 연산자

집합 연산자(SET OPERATOR)는 여러 건의 데이터들(집합)을 연산하는것이다.

주요 집합 연산자 4가지

연산자 종류내용
UNION두 집합의 결과를 합쳐서 출력, 중복 값 제거하고 정렬함
UNION ALL두 집합의 결과를 합쳐서 출력, 중복 값 제거 안하고 정렬 안 함
INTERSECT두 집합의 교집합 결과를 출력 및 정렬함
MINUS두 집합의 차집합 결과를 출력 및 정렬함. 쿼리의 순서가 중요함

위의 4가지 집합 연산자를 사용할 경우에 주의사항 세 가지

  • 두 집합의 SELECT 절에 오는 Column의 개수가 동일해야 한다.내용의 개수가 아니라 Column이다
  • 두 집합의 SELECT 절에 오는 Column의 데이터 형이 동일해야 한다.Column의 개수가 같더라도 들어가는 내용이 문자와 숫자 처럼 형이 다르면 실행되지 않는단 얘기
  • 두 집합의 컬럼명은 달라도 상관 없다.

UNION / UNION ALL (두 집합의 결과들을 더한다)

UNION과 UNION ALL 연산자는 두 집합을 더해서 결과를 출력한다. 차이점은

  • 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 연산자는 두 집합의 교집합 부분을 찾아내는 집합 연산자이다.

오라클은 교집합을 정렬을 통해 찾게된다. 즉, INTERSECT연산자는 정렬을 동반하게 되므로 많은 데이터를 대상으로 할 경우 속도가 느려진다.

SELECT studno, name
FROM student
WHERE deptno1 = 101
INTERSECT
SELECT studno, name
FROM student
WHERE deptno2 = 201 ;

MINUS 연산자 사용하기

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
profile
goaswon

0개의 댓글