저자 : 아사이 아츠시
출판 : 한빛미디어
발매 : 2015.11.01
1. SQL과 집합
- SELECT 명령을 실행하면 데이터베이스에 질의하며, 그 결과 몇 개의 행이 반환됨.
이때 반환된 결과 전체를 하나의 집합으로 , 집합 내 하나의 행을 하나의 요소로 볼 수 있음.
2. UNION으로 합집합 구하기
- 집합의 연산 중 '합집합'은 집합을 서로 더한 것을 의미. A U B 로 표기.
- SQL에서는 SELECT명령의 실행 결과를 하나의 집합으로 다룰 수 있음. 합집합을 계산할 경우에는 UNION 키워드를 사용.
SELECT * FROM sample71_a;
> 결과
a |
1 |
2 |
3 |
SELECT * FROM sample71_b;
> 결과
b |
2 |
10 |
11 |
- 두 개의 SELECT명령을 UNION해서 합집합 구하기
SELECT * FROM sample71_a
UNION
SELECT * FROM sample71_b;
> 결과
(두개의 집합에서 겹쳐지는 부분(동일 행), 즉 요소 2 가 계산 결과로는 한 개 밖에 나타나지 않는다. ->집합의 합집합 연산과 동일)
a |
1 |
2 |
3 |
10 |
11 |
- UNION 사용 시, 각각의 SELECT명령의 열의 내용은 서로 일치해야 함. sample71_a 와 sample71_b의 경우 열 이름은 다르지만 열 개수와 자료형이 서로 같기 때문에 일치한다고 할 수 있음. 완전히 열 구성이 다른 테이블을 UNION으로 묶을 수는 없음
UNION을 사용할 때의 ORDER BY
- UNION으로 SELECT명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정해 정렬 할 수 없음.
ORDER BY를 지정할 때는 마지막 SELECT 명령에만 지정.
SELECT a FROM sample71_a ORDER BY a
UNION
SELECT b FROM sample71_b;
==> 위와 같이 실행 불가. 에러 발생
SELECT a FROM sample71_a
UNION
SELECT b FROM sample71_b ORDER BY b;
==> 이 쿼리에서도 에러 발생. 마지막의 SELECT명령의 결과만 정렬하는 것이 아니라 합집합의 결과를 정렬하는 것이기 때문.
열 이름이 일치하지않는 경우 이러한 문제 발생.
SELECT a AS c FROM sample71_a
UNION
SELECT b AS c FROM sample71_b ORDER BY c;
==> 쿼리 정상 실행. 위 경우 서로 동일하게 별명을 붙여 정렬 가능.
즉! UNION으로 SELECT명령을 연결하는 경우, 가장 마지막 SELECT 명령에 대해서만 ORDER BY구를 지정할 수 있다. ORDER BY구에 지정하는 열은 별명을 붙여 이름을 일치 시킨다.
- 경우에 따라서는 중복을 제거하지않고 2개의 SELECT명령의 결과를 그냥 합치고 싶은 때도 있음. 이러한 경우에는 UNION ALL을 사용. (그냥 UNION을 한 결과에는 중복값이 제거됨)
- 두 개의 SELECT명령을 UNION ALL해서 합집합 구하기
SELECT * FROM sample71_a
UNION ALL
SELECT * FROM sample71_b;
> 결과
(두개의 집합에서 동일한 2라는 값을 가진 행이 중복되어 표시됨)
a |
1 |
2 |
3 |
2 |
10 |
11 |
- UNION ALL은 두 개의 집합을 단순하게 합치는 것. UNION에서는 이미 존재하는 값인지를 검사하는 처리가 필요한 만큼, UNION ALL이 성능적으로는 유리함. 즉, 중복값이 없는 경우엔 UNION ALL을 사용하는 편이 나음.
3. 교집합과 차집합
- MySQL에서는 지원되지 않지만 SQL을 이용해 교집합, 차집합도 구할 수 있음.
- 교집합은 INTERSECT를, 차집합은 EXCEPT(Oracle의 경우엔 MINUS)를 사용.
- 교집합은 두 개 집합이 겹치는 부분. 공통 부분.
- 차집합은 집합에서 다른쪽의 집합을 제거하고 남은 부분. 계산 개상이 되는 두 개의 집합에 공통부분이 존재하지 않으면 차집합을 구해도 결과는 바뀌지 않음. 또한 완전히 같은 집합끼리 차집합을 계산하면 아무런 요소도 존재하지 않는 공집합이 됨. 차집합의 결과가 공집합인지 아닌지에 따라 두 개의 집합이 동일한지 아닌지를 알 수 있음.
'Study > DB' 카테고리의 다른 글
[SQL 첫걸음] 8장.데이터베이스 설계 - 34.데이터베이스 설계 (0) | 2018.09.30 |
---|---|
[SQL 첫걸음] 7장.복수의 테이블 다루기 - 32.테이블 결합 (0) | 2018.09.27 |
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 30.뷰 작성과 삭제 (0) | 2018.09.27 |
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 29.인덱스 작성과 삭제 (0) | 2018.09.16 |
[SQL 첫걸음] 6장.데이터베이스 객체 작성과 삭제 - 28.인덱스 구조 (0) | 2018.09.16 |