콘텐츠로 이동

6. 집합 연산자#

이 장에서는 SQL 질의 실행 결과 집합을 대상으로 연산하는 집합 연산자들에 대해서 설명한다.

UNION#

구문#

SELECT statement1 UNION SELECT statement2

설명#

두 질의문의 결과를 모두 반환하는 연산자이다. 단, 양쪽 질의의 결과에 동일한 값이 있을 경우 한건만 반환된다.

예제#

<질의> 생일이 1980년 이후인 사원과 100개 미만의 주문량을 받은 사원의 사원번호를 출력하라. 중복된 사원번호는 한번만 출력되게 하라.

SELECT eno
  FROM employees
 WHERE birth > '800101'
UNION
SELECT eno
  FROM orders
 WHERE qty < 100;
ENO
--------------
4
7
8
12
13
15
20
7 rows selected.

UNION ALL#

구문#

SELECT statement1 UNION ALL SELECT statement2

설명#

두 질의문의 결과를 모두 반환하는 연산자이다. 양쪽 질의의 결과에 동일한 값이 있을 경우에 중복된 값이 모두 반환된다.

예제#

<질의> 생일이 1980년 이후인 사원과 100개 미만의 주문량을 받은 사원의 사원번호를 출력하라. 중복된 사원번호도 모두 출력되게 하라.

SELECT eno
  FROM employees
 WHERE birth > '800101'
UNION ALL
SELECT eno
  FROM orders
 WHERE qty < 100;
ENO
--------------
4
7
8
12
13
15
12
20
20
9 rows selected.

INTERSECT#

구문#

SELECT statement1 INTERSECT SELECT statement2

설명#

두 질의문의 결과 중 공통된 행을 반환하는 연산자이다.

예제#

<질의> 한번이라도 주문된 적이 있는 상품을 모두 출력하라.

SELECT gno FROM goods 
INTERSECT 
SELECT gno FROM orders;
GNO                   
------------------------
A111100002                                                    
E111100001                                                    
D111100008                                                    
D111100004                                                    
C111100001                                                    
E111100002                                                    
D111100002                                                    
D111100011                                                    
D111100003                                                    
D111100010                                                    
E111100012                                                    
F111100001                                                    
E111100009                                                    
E111100010                                                    
E111100007                                                    
E111100013                                                    
16 rows selected.

MINUS#

구문#

SELECT statement1 MINUS SELECT statement2

설명#

첫번째 검색 결과에서 두 번째 검색 결과를 제외한 결과를 반환하는 연산자이다.

예제#

<질의> 한번도 주문된 적이 없는 상품들의 제품번호를 출력하라.

SELECT gno FROM goods
MINUS
SELECT gno FROM orders;
GNO                   
------------------------
A111100001            
B111100001            
C111100002            
D111100001            
D111100005            
D111100006            
D111100007            
D111100009            
E111100003            
E111100004            
E111100005            
E111100006            
E111100008            
E111100011            
14 rows selected.

연산 순서#

연산의 순서 즉, 연산자 우선 순위는 데이터베이스 서버가 수식 내의 연산자들을 처리하는 순서이다. 다수의 연산자를 포함하는 수식이 처리될 때, 높은 우선순위의 연산자가 낮은 우선순위의 연산자보다 먼저 처리된다. 같은 우선순위를 갖는 연산자는 수식 내에서 나열된 순서 즉, 왼쪽에서 오른쪽으로 처리된다.

설명#

SQL 연산자의 연산 우선순위를 내림차순으로 다음 표에 보여주고 있다. 수식 내에 괄호를 사용하여 우선순위 규칙보다 우선 적용되게 할수 있다.

우선순위 레벨 연산자
1 모든 비교 연산자
2 NOT
3 AND
4 OR

예제#

<질의> 월급이 1850 달러를 넘는 엔지니어의 이름, 직위, 급여와 급여에 상관없이 모든 영업 사원의 이름, 직위, 급여를 출력하라.

SELECT e_firstname
     , e_lastname
     , emp_job
     , salary
  FROM employees
 WHERE emp_job = 'sales rep'
    OR emp_job = 'engineer'
   AND salary >= 1850;
E_FIRSTNAME           E_LASTNAME            EMP_JOB          SALARY
------------------------------------------------------------------------------
Ken                   Kobain                engineer         2000
Sandra                Hammond               sales rep        1890
Alvar                 Marquez               sales rep        1800
William               Blake                 sales rep
4 rows selected.

<질의> 월급이 1850 달러를 넘는 엔지니어의 이름, 직위, 급여와 월급이 1850 달러를 넘는 영업 사원의 이름, 직위, 급여를 출력하라.

SELECT e_firstname
     , e_lastname
     , emp_job
     , salary
  FROM employees
 WHERE (emp_job = 'sales rep' OR emp_job = 'engineer')
   AND salary >= 1850;
E_FIRSTNAME           E_LASTNAME            EMP_JOB          SALARY
------------------------------------------------------------------------------
Ken                   Kobain                engineer         2000
Sandra                Hammond               sales rep        1890
2 rows selected.