ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 집합 연산자
    Data Base_Oracle/SQL 2020. 1. 8. 23:30

    집합 연산자

    서로 다른 두 개의 SQL문장의 실행결과를 하나로 합쳐서
    보여줄 수 있게 하는 연산자

    종류 설명
    union 합집합, 중복을 제거한 결과의 합을 검색
    union all 합집합, 중복을 포함한 결과의 합을 검색
    intersect 교집합, 양쪽 모두에서 포함된 행을 검색
    minus 차집합, 첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 나머지를 검색

    ※ 두 SQL문장의 select ~ from 사이에 나오는 필드 개수와 자료형이 같아야 함
    테이블과 필드명은 다를 수 있음

    # 예제

    { 문제 1 }
    ▷ emp 테이블에서 업무가 MANAGER인 사원의 사번, 이름 출력

    ▶ [ SQL> select empno, ename from emp where job='MANAGER'; ]

    EMPNO ENAME
    7566 JONES
    7698 BLAKE
    7782 CLARK

    { 문제 2 }
    ▷ emp 테이블에서 사원명이 A자로 시작하는 사원의 사번, 이름 출력

    ▶ [ SQL> select empno, ename from emp where ename like 'A%'; ]

    EMPNO ENAME
    7499 A
    7876 ADAMS

    { UNION }

    ▷ 위의 두 결과의 합집합을 출력, 중복 데이터는 제외

    ▶ [ SQL> select empno, ename from emp where job='MANAGER'
    union
    select empno, ename from emp where ename like 'A%'; ]

    EMPNO ENAME
    7499 ALLEN
    7876 ADAMS
    7566 JONES
    7698 BLAKE
    7782 CLARK

    ※ 두 개의 SQL결과를 계산한 뒤 정렬해서 보여줌
    ~ job='MANAGER' 가 SQL문장에서는 먼저 쓰였으나 아래에 출력

    { UNION ALL }

    ▷ 위의 두 문제를 동시에 출력, 중복 데이터를 포함

    ▶ [ SQL> select empno, ename from emp where job='MANAGER'
    union all
    select empno, ename from emp where ename like 'A%'; ]

    EMPNO ENAME
    7566 JONES
    7698 BLAKE
    7782 CLARK
    7499 ALLEN
    7876 ADAMS

    ※ 두 개의 SQL 실행 결과를 섞지 않고 있는 그대로 합쳐서 보여줌
    ~ job='MANAGER' 가 SQL문장에서 먼저 쓰였기 때문에 위에 출력

    { INTERSECT }

    ▷ 위의 두 문제에 공통으로 포함되는 레코드를 출력

    ▶ [ SQL> select empno, ename from emp where job='MANAGER'
    intersect
    select empno, ename from emp where ename like 'A%'; ]

    → '선택된 레코드가 없습니다.'

     

    ※ 두 SQL문장의 실행결과에 동시에 속하는 레코드가 없음

    { MINUS }

    ▷ 위의 두 문제에서 첫 번째 SQL문장의 결과에서
    두 번째 SQL문장의 결과를 제외한 뒤 출력

    ▶ [ SQL> select empno, ename from emp where job='MANAGER'
    minus
    select empno, ename from emp where ename like 'A%'; ]

    EMPNO ENAME
    7566 JONES
    7698 BLAKE
    7782 CLARK

    ※ 두 SQL문장의 실행결과에 교집합이 없기 때문에 먼저 작성된 SQL문장의 결과만 출력

    # 에러

    { 필드의 개수가 맞지 않을 때 발생하는 에러 }

    ▶ [ SQL> select empno, ename, sal from emp where job='MANAGER'
    union all
    select empno, ename from emp where ename like 'A%';
    1행에 오류:
    ORA-01789: 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다. ]

     

    { 자료형이 맞지 않을 때 발생하는 에러 }

    ▶ [ SQL> select sal, comm from emp where job='MANAGER'
    union all
    select empno, ename from emp where ename like 'A%' ;
    1행에 오류:
    ORA-01790: 대응하는 식과 같은 데이터 유형이어야 합니다 ]

     

    { ※ 테이블과 필드명은 서로 달라도 결과가 출력됨 ※ }

    ▶ [ SQL> select empno, ename from emp where job='MANAGER'
    union all
    select deptno, dname from dept where dname like 'A%' ;

    EMPNO ENAME
    7566 JONES
    7698 BLAKE
    7782 CLARK
    10 ACCOUNTING

    서로 다른 SQL문장의 결과를 합쳐서 출력하는 집합 연산자에 대해 알아보았습니다.

    집합 개념이기 때문에 벤다이어그램을 생각하면 어렵지 않게 이해할 수 있습니다

    'Data Base_Oracle > SQL' 카테고리의 다른 글

    SQL 단순 VIEW 생성  (0) 2020.01.08
    SQL_VIEW 개요 & USER_VIEWS  (0) 2020.01.08
    SQL_ROLLBACK  (0) 2020.01.08
    SQL_Sub Query_Update & Delete  (0) 2020.01.08
    SQL_Sub Query_Table 만들기  (0) 2020.01.07

    댓글

Designed by Tistory.