집합 연산자

집합 연산자의 종류

 

SELECT ...
[UNION ALL | UNION | INTERSECT | MINUS]
SELECT ...

 

* 카디널리티 (튜플 수 : 열)

* 데이터베이스 성능 : 마지막 데이터를 읽는 시간

 

※ 데이터 검색시 데이터 타입이 다를 경우 NULL을 검색조건에 넣어준다.

SELECT eno, ename, NULL hiredate, comm, sal
FROM emp
UNION
SELECT pno, pname, hiredate, NULL,NULL
FROM professor
ORDER BY hiredate;

ENO     ENAME      HIREDATE         COMM        SAL
------- ---------- ---------- ---------- ----------
1030    김동평     2002/02/15
1001    송강       2002/08/12
1006    장청아     2003/05/20
1038    하영진     2004/03/02
1008    문규식     2005/02/11
1033    박삭광     2005/07/14
1029    주동평     2006/01/26

ENO     ENAME      HIREDATE         COMM        SAL
------- ---------- ---------- ---------- ----------
1016    호연작     2009/10/21
1007    이초아     2010/07/06
1017    최무송     2011/01/24
0001    안영희                         0       4800
0120    김경현                      2500       4000
0201    안영숙                      2000       3900
0202    손하늘                       980       3510

 

예제 1. 2000년 이후에 입사한 사원과 부임한 교수의 명단을 검색한다.

union all - 중복 포함

SELECT pno 번호, pname 이름, hiredate 입사일_부임일
FROM professor
WHERE hiredate >= '2000/01/01'
UNION ALL
SELECT eno, ename, hdate
FROM emp
WHERE hdate >= '2000/01/01';

번호             이름       입사일_부
---------------- ---------- ----------
1001             송강       2002/08/12
1006             장청아     2003/05/20
1007             이초아     2010/07/06
1008             문규식     2005/02/11
1012             이영준     2000/05/18
1016             호연작     2009/10/21
1027             임충원     2001/06/03

 

union - 중복 제거

SELECT pno 번호, pname 이름, hiredate 입사일_부임일
FROM professor
WHERE hiredate > '2000/01/01'
UNION
SELECT eno, ename, hdate
FROM emp
WHERE hdate > '2000/01/01';

번호             이름       입사일_부
---------------- ---------- ----------
0269             권나현     2015/05/21
0309             김선유     2011/01/03
0401             김진성     2008/03/13
0702             김민지     2017/01/09
0801             천유정     2000/10/09
1001             송강       2002/08/12
1006             장청아     2003/05/20

 

예제 2. 제갈씨 성을 가진 사원 중에 지원 업무를 하지 않는 사원을 검색한다.

SELECT eno, ename, job
FROM emp
WHERE ename LIKE '제갈%'
MINUS
SELECT eno, ename, job
FROM emp
WHERE job = '지원';

ENO     ENAME      JOB
------- ---------- -------
2002    제갈민     개발

 

예제 3. 화학, 물리학과 학생들 중에 학점이 3.0 이상인 학생을 검색한다.

SELECT sno 학번, sname 이름, major 학과, avr 성적 
FROM student
WHERE major IN ('화학','물리')
INTERSECT
SELECT sno, sname, major, avr FROM student
WHERE avr >= 3;

학번    이름       학과          성적
------- ---------- ------- ----------
905301  유태지     화학          3.28
914502  문수보     물리          3.33
914504  심빈경     물리          3.33
924501  권석복     물리             4
924505  서찬호     물리             3
925301  김환       화학          3.58
934504  갑서진     물리          3.22

 

실습

1. 화학과 학생과 교수를 검색한다. (집합 연산자를 이용한다.)

SELECT sno 번호, sname 이름, major 학과
FROM student
WHERE major = '화학'
UNION
SELECT pno, pname, section
FROM professor
WHERE section = '화학';

번호    이름       학과
------- ---------- -------
1001    송강       화학
1004    시진영     화학
1006    장청아     화학
1007    이초아     화학
1008    문규식     화학
905301  유태지     화학
905302  정욱상     화학


2. 정교수의 명단과 모델링이 업무인 직원의 이름, 입사일(부임일)을 검색한다.

SELECT pno 번호, pname 이름, hiredate 입사일, orders 직위_업무
FROM professor
WHERE orders = '정교수'
UNION
SELECT  eno, ename, hdate, job
FROM emp
WHERE job = '모델링';

번호    이름       입사일     직위_업무
------- ---------- ---------- ---------
1001    문시현     1991/02/01 모델링
1001    송강       2002/08/12 정교수
1002    김주란     1992/03/03 모델링
1003    양선호     1995/02/21 모델링
1009    이준영     1991/10/04 정교수
1010    이규진     1998/10/07 정교수
1021    왕사진     1997/02/17 정교수

번호    이름       입사일     직위_업무
------- ---------- ---------- ---------
1029    주동평     2006/01/26 정교수
1030    김동평     2002/02/15 정교수
1033    박삭광     2005/07/14 정교수
1035    장관용     1985/07/28 정교수

+ Recent posts