붓, 그리다
집합연산자 본문
[집합연산자 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