SQL 첫걸음 - 7장 집합 연산(1/2)

2020-11-01

1. SQL과 집합

SELECT 명령을 실행하면 데이터베이스에 질의하며, 그 결과 몇 개의 행이 반환됨. 이때 반환된 결과 전체를 하나의 집합으로 , 집합 내 하나의 행을 하나의 요소로 볼 수 있음.

2. UNION으로 합집합 구하기

집합의 연산 중 ‘합집합’은 집합을 서로 더한 것을 의미. A U B 로 표기. SQL에서는 SELECT명령의 실행 결과를 하나의 집합으로 다룰 수 있음. 합집합을 계산할 경우에는 UNION 키워드를 사용.

1512512312312

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을 한 결과에는 중복값이 제거됨)

57573453452

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

3. 교집합과 차집합

  • MySQL에서는 지원되지 않지만 SQL을 이용해 교집합, 차집합도 구할 수 있음.
  • 교집합은 INTERSECT를, 차집합은 EXCEPT(Oracle의 경우엔 MINUS)를 사용.
  • 교집합은 두 개 집합이 겹치는 부분. 공통 부분.
  • 차집합은 집합에서 다른쪽의 집합을 제거하고 남은 부분. 계산 개상이 되는 두 개의 집합에 공통부분이 존재하지 않으면 차집합을 구해도 결과는 바뀌지 않음. 또한 완전히 같은 집합끼리 차집합을 계산하면 아무런 요소도 존재하지 않는 공집합이 됨. 차집합의 결과가 공집합인지 아닌지에 따라 두 개의 집합이 동일한지 아닌지를 알 수 있음.

출처 : https://smilejh.tistory.com/