Study/DB

[SQL 첫걸음] 7장.복수의 테이블 다루기 - 31.집합 연산

momo02 2018. 9. 27. 19:44
반응형

저자 : 아사이 아츠시

출판 : 한빛미디어 

발매 : 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 가 계산 결과로는 한 개 밖에 나타나지 않는다. ->집합의 합집합 연산과 동일

1

2 

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라는 값을 가진 행이 중복되어 표시됨) 

1

2 

3

2 

10 

11 

- UNION ALL은 두 개의 집합을 단순하게 합치는 것. UNION에서는 이미 존재하는 값인지를 검사하는 처리가 필요한 만큼, UNION ALL이 성능적으로는 유리함. 즉, 중복값이 없는 경우엔 UNION ALL을 사용하는 편이 나음. 




3. 교집합과 차집합

- MySQL에서는 지원되지 않지만 SQL을 이용해 교집합, 차집합도 구할 수 있음.

- 교집합은 INTERSECT를, 차집합은 EXCEPT(Oracle의 경우엔 MINUS)를 사용. 

- 교집합은 두 개 집합이 겹치는 부분. 공통 부분.

- 차집합은 집합에서 다른쪽의 집합을 제거하고 남은 부분. 계산 개상이 되는 두 개의 집합에 공통부분이 존재하지 않으면 차집합을 구해도 결과는 바뀌지 않음. 또한 완전히 같은 집합끼리 차집합을 계산하면 아무런 요소도 존재하지 않는 공집합이 됨. 차집합의 결과가 공집합인지 아닌지에 따라 두 개의 집합이 동일한지 아닌지를 알 수 있음. 

반응형