Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

붓, 그리다

집합연산자 본문

Oracle

집합연산자

붓그린 2017. 6. 16. 16:54

[집합연산자 union, union all] -> 시큐어코딩

- 집합연산자 : 서로 다른 두 개의 SQL문장의 실행결과 -> 하나로 합쳐서 결과를 보여준다.
- union, union all, intersect, minus ~

1) union(합집합): 서로 같은 테이블이면서 서로 같은 필드와 자료형을 사용한 경우
2) minus(차집합A-B) : A해 해당되는 SQL만 출력
   mySQL 의 경우 except


Q1.  emp테이블에서 업무가 MANAGER 인 사원의 사번, 이름을 구하시오


1) 문장 1

select empno, ename from emp where job='MANAGER';

  EMPNO ENAME
---------- ----------
  7566 JONES
  7698 BLAKE
  7782 CLARK


2) 문장 2

  1 select empno, ename from emp
  2* where ename like 'A%'
SQL> /

  EMPNO ENAME
---------- ----------
  7499 ALLEN
  7876 ADAMS


3) union(합집합) : 두 문장 결합하기

SQL> ED
file afiedt.buf(이)가 기록되었습니다

  1 select empno, ename from emp
  2 where job='MANAGER'
  3 union
  4 select empno, ename from emp
  5* where ename like 'A%'
SQL> /

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

-> 사번순으로 정렬, 중복행을 하나로 만들고 두 개의 문장을 합쳐서 자동으로 정렬하여 나타남


4) minus(차집합)

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1 select empno, ename from emp
  2 where job='MANAGER'
  3 minus
  4 select empno, ename from emp
  5* where ename like 'A%'
SQL> /

  EMPNO ENAME
---------- ----------
  7566 JONES
  7698 BLAKE
  7782 CLARK

-> 문장 1의 데이터만 출력


5) union all

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1 select empno, ename from emp
  2 where job='MANAGER'
  3 union all
  4 select empno, ename from emp
  5* where ename like 'A%'
SQL> /

  EMPNO ENAME
---------- ----------
  7566 JONES
  7698 BLAKE
  7782 CLARK  ---- 문장 1
  7499 ALLEN
  7876 ADAMS  ---- 문장 2

-> 중복된 데이터를 모두 보여준다. 문장1, 문장 2 순서대로 보여주고 합쳐서 자동으로 정렬하지 않음



5) intersect(교집합) : 공통인 부분만 출력

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1 select empno, ename from emp
  2 where job='MANAGER'
  3 intersect
  4 select empno, ename from emp
  5* where ename like 'A%' or job='MANAGER'
SQL> /

  EMPNO ENAME
---------- ----------
  7566 JONES
  7698 BLAKE
  7782 CLARK








[집합연사자의 주의할점]


1) 서로 다른 필드를 사용해도 상관이 없다.

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1 select empno, job from emp
  2 where job='MANAGER'
  3 union all
  4 select empno, ename from emp
  5* where ename like 'A%'
SQL> /

  EMPNO JOB
---------- ----------
  7566 MANAGER
  7698 MANAGER
  7782 MANAGER
  7499 ALLEN
  7876 ADAMS

-> 다른 필드를 써도 출력 가능




2) 예외. 합쳐지는 필드의 자료형은 반드시 같아야 한다.

SQL> ed
file afiedt.buf(이)가 기록되었습니다

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

-> 테이더 필드의 자료형이 다르기 때문에 오류(숫자=숫자, 문자=문자)



3) 합쳐지는 필드의 개수는 같아야 한다.

SQL> ed
file afiedt.buf(이)가 기록되었습니다

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

-> 필드의 개수가 다름


-> 시큐어코딩에서 활용


4) 서로 다른 테이블도 합치기가 가능하다.

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1 select empno, ename from emp
  2 where job='MANAGER'
  3 union all
  4 select deptno, dname from dept
  5* where dname like 'A%'
SQL> /

  EMPNO ENAME
---------- --------------
  7566 JONES
  7698 BLAKE
  7782 CLARK
  10 ACCOUNTING

-> 필드의 갯수, 자료형만 일치하면 서로 다른 테이블도 합쳐서 출력 가능















'Oracle' 카테고리의 다른 글

TCL 트랜잭션(commit, rollback, savepoint)  (1) 2017.06.16
뷰 veiw 생성/삭제/수정  (0) 2017.06.16
서브쿼리  (0) 2017.06.16
조인 개요 및 작성법  (0) 2017.06.16
제약 조건 2  (0) 2017.06.16
Comments