반응형
UNION
- 두 개 이상의 테이블의 결합을 나타낸다.
- 합집합 이라고도 한다.
- 특이사항은 테이블의 중복을 제거하고 정렬되어 출력된다는 점이다.
- 중복을 제거하고 정렬하기 때문에 정렬되지 않은 많은 데이터가 있을 경우 성능이 느려진다.
UNION 기본 사용법
SELECT oracleNo, FROM oracleStudy
UNION
SELECT oracleNo FROM grade;
* 결과값
oracleNo |
1 |
2 |
3 |
4 |
물론 두 개 이상의 테이블도 UNION이 가능하다.
SELECT oracleNo, name FROM oracleStudy
UNION
SELECT oracleNo, firstName FROM grade
UNION
SELECT oracleNo, lastName FROM oracleTest;
* 결과값
oracleNo | name |
1 | GANGMINHUK |
1 | MINHUK |
1 | GANG |
2 | GANGMINHUK |
2 | MINHUK |
2 | GANG |
뭔가 결과가 이상하지 않은가?
중복을 분명 제거한다고 했는데, 중복이 제거되지 않은 결과를 볼 수 있다.
그 이유는 컬럼이 두 개 이상이면 개수만큼의 컬럼을 "한 묶음"으로 보고 그 묶음과 동일한 것만 중복제거하기 때문이다.
또 다른 이상한 점은 컬럼명이 name으로 출력된다는 건데,
이는 그 뒤에 firstName과 lastName을 select같이 했지만 첫 번째로 명시된 컬럼명을 따라가기 때문이다.
UNION ALL
- 두 개 이상의 데이블의 결합을 나타낸다.
- 특이사항으로는 테이블의 중복을 허용하여 모두 출력한다.
UNION ALL 기본 사용법
SELECT oracleNo FROM oracleStudy
UNION ALL
SELECT oracleNo FROM grade;
* 결과값
oracleNo |
1 |
2 |
3 |
1 |
4 |
이처럼 UNION과 다르게 정렬도 안되어 있고, 중복조차 허용하여 전부 출력한다.
* 정렬을 할 시 주의할 점은 마지막으로 명시한 select문 다음에 order by를 실시해야 한다는 점이다.
UNION과 UNION ALL 사용 시 주의사항
- 컬럼의 타입과 순서 그리고 컬럼의 개수가 동일해야 한다. (첫 번째 컬럼끼리 합치고 두 번째 컬럼끼리 합치는 것이다.)
- 여기서 컬럼명도 무조건 같아야 한다는 사람도 있지만 일단 같지 않아도 출력은 된다. 단지 첫 번째 명시한 컬럼명으로 통일된다.
- 그래서 가독성을 위해 Alias 별칭을 사용하여 통일시켜주는 게 좋다.
- 컬럼의 타입은 단순하게 문자, 숫자 이런게 아니라 NVARCHAR2랑 VARCHAR2 이것 역시 에러가 발생한다.
- 정확히 컬럼의 타입이 같아야 한다. CHAR는 CHAR끼리 NVARCHAR2는 NVARCHAR2 끼리 - 합집합에 대해 정렬을 시킬 경우 맨 마지막에 명시된 SELECT문에서 ORDER BY 정렬을 실시해야 한다.
- ORDER BY 시 주의할 점이 첫 번째로 명시된 SELECT 문의 컬러명 혹은 ALIAS로 작성해야 한다는 점이다.
반응형
댓글