집합 연산자는 두 개 이상 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중에 집합 연산자(Set Operator)를 사용하는 방법이다.
- 집합 연산자는 여러 개의 질의의 결과를 연결하여 하나로 결합하는 방식을 사용한다.
제약 조건
- SELECT 절의 칼럼수가 동일하고 SELECT절의 동일 위치에 존재하는 칼람의 데이터 타입이 상호 호환 가능해야 한다.
상호 호환 가능해야 한다는 건 암시적으로 타입이 변환이 가능함을 뜻한다. 꼭 동일할 필요는 없다.
- ORDER BY 절은 맨 마지막 문장에서만 사용할 수 있다.
- 만약 SELECT문의 리스트가 늘어나면 집합 연산 대상도 합쳐져서 UNION에서의 중복제거가 의미가 없어질 수 있다.
- BLOB, CLOB, BFILE 타입의 칼럼의 대해서는 집합 연산자를 사용할 수 없다.
- UNION, INTERSECT, MINUS 연산자는 LONG형 칼럼에는 사용할 수 없다.
문자 데이터 타입
데이터타입 | 설명 |
CHAR(n) | 고정길이 문자 / 최대 2000byte / 디폴트 값은 1byte |
VARCHAR2(n) | 가변길이 문자 / 최대 4000BYTE / 디폴트 값은 1byte |
NCHAR(n) | 고정길이 유니코드 문자(다국어 입력가능) / 최대 2000byte / 디폴트 값은 1byte |
NVARCHAR(n) | 가변길이 유니코드 문자(다국어 입력가능) / 최대 2000byte / 디폴트 값은 1byte |
LONG | 최대 2GB 크기의 가변길이 문자형 |
CLOB | 대용량 텍스트 데이터 타입(최대 4Gbyte) |
NCLOB | 대용량 텍스트 유니코드 데이터 타입(최대 4Gbyte) |
집합 연산자는 다음과 같은 상황에 사용하기 적합하다.
- 제약조건을 만족시키며 서로 다른 테이블에서 유사한 형태의 결과를 반환하는 것을 하나의 결과로 합치고자 할 때
- 동일 테이블에서 서로 다른 질의를 수행하여 결과를 합치고자 할 때
- 튜닝 관점에서는 실행 계획을 분리하고자 하는 목적
종류
UNION : 여러 개의 SQL 문의 결과를 합집합으로 결과를 만들고 결과에서 모든 중복된 행을 하나의 행으로 만든다.
SELECT 'FIRST' 구분행, PLAYER_NAME FROM PLAYER
UNION
SELECT 'SECOND' 구분행 , PLAYER_NAME FROM PLAYER ;
UNION ALL : 여러 개의 SQL 문의 결과를 합집합으로 결과를 만들고 중복된 행도 그대로 결과에 반영된다. 일반적으로 두 개의 결과가 상호 배타적일 때 많이 사용한다.
SELECT 절
UNION ALL
SELECT 절
INTERSECT : 여러 개의 SQL 문의 결과에 대한 교집합이다. 중복된 행을 하나로 만든다. 이 INTERSECT는 논리 연산자 AND, EXISTS, IN(서브 쿼리)로 대체가 가능하다.
SELECT PLAYER_NAME FROM PLAYER
INTERSECT
SELECT PLAYER_NAME FROM PLAYER ;
EXCEPT / MINUS(ORACLE) : 앞의 SQL 문의 결과에서 뒤의 SQL 문의 결과의 차집합을 구한다. 중복된 행은 하나로 만든다. 이 또한 NOT EXISTS , NOT IN (서브 쿼리)로 대체가 가능하다.
* UNION ALL을 제외한 다른 집합 연산 잔에서는 SQL문 결과 집합에서 먼저 중복된 건을 배제하는 작업을 수행한 후에 집합 연산을 적용한다.
'Database' 카테고리의 다른 글
데이터베이스 특수문자 패스워드 및 인덱스 (0) | 2021.10.28 |
---|---|
그룹 함수 (1) (0) | 2021.05.23 |
파티션 테이블 (0) | 2021.05.22 |
파일 구조(file organization) (0) | 2021.05.02 |
조인 수행원리 (0) | 2021.05.01 |
댓글