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.