:meta-keywords: union statement, difference statement, intersection statement :meta-description: Statement set operators are used to get union, difference or intersection on the result of more than one query statement specified as an operand. **************** 문장 집합 연산자 **************** UNION, DIFFERENCE, INTERSECTION =============================== 피연산자로 지정된 하나 이상의 질의문의 결과에 대해 합집합(**UNION**), 차집합(**DIFFERENCE**), 교집합(**INTERSECTION**)을 구하기 위하여 문장 집합 연산자(Statement Set Operator)를 이용한다. 단, 두 질의문의 대상 테이블에서 조회하고자 하는 데이터 타입이 동일하거나, 묵시적으로 변환 가능해야 한다. :: query_term statement_set_operator [qualifier] [{statement_set_operator [qualifier] }]; ::= query_specification subquery * *qualifier* * DISTINCT, DISTINCTROW 또는 UNIQUE(결과로 반환되는 인스턴스가 서로 다르다는 것을 보장) * ALL (모든 인스턴스가 반환, 중복 허용) * *statement_set_operator* * UNION (합집합) * DIFFERENCE (차집합) * INTERSECT | INTERSECTION (교집합) 다음은 CUBRID가 지원하는 문장 집합 연산자를 나타낸 표이다. **문장 집합 연산자** +------------------------+-----------------------------+---------------------------------------------------------+ | 문장 집합 연산자 | 설명 | 비고 | +========================+=============================+=========================================================+ | **UNION** | 합집합 | **UNION ALL** | | | 중복을 허용하지 않음 | 이면 중복된 값을 포함한 모든 결과 인스턴스 출력 | +------------------------+-----------------------------+---------------------------------------------------------+ | **DIFFERENCE** | 차집합 | **EXCEPT** | | | 중복을 허용하지 않음 | 연산자와 동일. | | | | **DIFFERENCE ALL** | | | | 이면 중복된 값을 포함한 모든 결과 인스턴스 출력 | +------------------------+-----------------------------+---------------------------------------------------------+ | **INTERSECTION** | 교집합 | **INTERSECT** | | | 중복을 허용하지 않음 | 연산자와 동일. | | | | **INTERSECTION ALL** | | | | 이면 중복된 값을 포함한 모든 결과 인스턴스 출력 | +------------------------+-----------------------------+---------------------------------------------------------+ 다음은 문장 집합 연산자를 가지고 질의를 수행하는 예이다. .. code-block:: sql CREATE TABLE nojoin_tbl_1 (ID INT, Name VARCHAR(32)); INSERT INTO nojoin_tbl_1 VALUES (1,'Kim'); INSERT INTO nojoin_tbl_1 VALUES (2,'Moy'); INSERT INTO nojoin_tbl_1 VALUES (3,'Jonas'); INSERT INTO nojoin_tbl_1 VALUES (4,'Smith'); INSERT INTO nojoin_tbl_1 VALUES (5,'Kim'); INSERT INTO nojoin_tbl_1 VALUES (6,'Smith'); INSERT INTO nojoin_tbl_1 VALUES (7,'Brown'); CREATE TABLE nojoin_tbl_2 (id INT, Name VARCHAR(32)); INSERT INTO nojoin_tbl_2 VALUES (5,'Kim'); INSERT INTO nojoin_tbl_2 VALUES (6,'Smith'); INSERT INTO nojoin_tbl_2 VALUES (7,'Brown'); INSERT INTO nojoin_tbl_2 VALUES (8,'Lin'); INSERT INTO nojoin_tbl_2 VALUES (9,'Edwin'); INSERT INTO nojoin_tbl_2 VALUES (10,'Edwin'); --Using UNION to get only distinct rows SELECT id, name FROM nojoin_tbl_1 UNION SELECT id, name FROM nojoin_tbl_2; :: id name =================================== 1 'Kim' 2 'Moy' 3 'Jonas' 4 'Smith' 5 'Kim' 6 'Smith' 7 'Brown' 8 'Lin' 9 'Edwin' 10 'Edwin' .. code-block:: sql --Using UNION ALL not eliminating duplicate selected rows SELECT id, name FROM nojoin_tbl_1 UNION ALL SELECT id, name FROM nojoin_tbl_2; :: id name =================================== 1 'Kim' 2 'Moy' 3 'Jonas' 4 'Smith' 5 'Kim' 6 'Smith' 7 'Brown' 5 'Kim' 6 'Smith' 7 'Brown' 8 'Lin' 9 'Edwin' 10 'Edwin' .. code-block:: sql --Using DEFFERENCE to get only rows returned by the first query but not by the second SELECT id, name FROM nojoin_tbl_1 DIFFERENCE SELECT id, name FROM nojoin_tbl_2; :: id name =================================== 1 'Kim' 2 'Moy' 3 'Jonas' 4 'Smith' .. code-block:: sql --Using INTERSECTION to get only those rows returned by both queries SELECT id, name FROM nojoin_tbl_1 INTERSECT SELECT id, name FROM nojoin_tbl_2; :: id name =================================== 5 'Kim' 6 'Smith' 7 'Brown'