집합 연산
관계형 모델에서의 관계형은 수학 집합론의 관계형 이론에서 유래했다.
- 데이터베이스의 데이터를 집합으로 간주해 다루기 쉽게 하자는 것
- SQL과 집합

원 안에 적혀있는 숫자가 요소에 해당한다.
- 데이터베이스에서는 테이블의 행이 요소에 해당한다.
- 행은 여러 개의 열로 구성되는 경우도 있으므로, 수치 상으로는 복수의 값이 존재한다.
- 집합의 요소라는 측면에서 보면 하나의 행이 곧 하나의 요소가 된다.
SELECT 명령을 실행하면 데이터베이스에 질의하며 그 결과 몇 개의 행이 반환된다.
반환된 결과 전체를 하나의 집합이라고 생각하면 된다.
UNION으로 합집합 구하기
2개의 집합A,B로 A = {1, 2, 3}, B = {2, 10, 11} 이라는 세개의 요소가 있을 때
2라는 요소는 A,B집합에 모두 존재한다. → 교집합
A,B의 합집합은 {1, 2, 3, 10, 11}이 된다.
- 단순하게 서로 더하면 {1, 2, 3, 2, 10, 11}과 같이 6개의 요소가 되지만 합집합에서는 그렇지 않는다.
UNION
SQL에서 집합을 계산할 때 문법
SELECT 명령의 실행 결과를 하나의 집합으로 다룰 수 있다.
- 합집합을 계산할 경우에는 수학에서 사용하던 U기호 대신 UNION 키워드를 사용한다.
- ‘A U B’는 SQL에서 ‘A UNION B’라고 표현한다. (A,B라고 했지만 실제로는 SELECT 명령)

SELECT 명령의 결과를 집합으로 간주하고 UNION으로 합집합을 구하면
SELECT * FROM a
UNION
SELECT * FROM b;
a |
1 |
2 |
3 |
10 |
11 |
두 개의 SELECT 명령을 하나의 명령으로 합치는 만큼, 세미클론은 맨 나중에 붙여야 된다.
- a 뒤에 세미콜론을 붙이면 도중에 명령이 끝나버려 제대로 실행이 안된다.
한 번의 쿼리 실행으로 두 개의 SELECT 명령이 내부적으로 실행되는 형식이다.
- 이때 각 SELECT 명령의 실행결과 (집합)를 합집합(UNION)으로 계산하여 최종적으로 결과를 반환한다.
- UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다.
- UNION을 이용하면 1+2+3..처럼 여러 개의 SELECT 명령을 하나로 묶을 수 있다.
- 각각의 SELECT 명령의 열의 내용은 서로 일치해야 한다.
- 열의 이름은 서로 다르더라도 열 개수와 자료형이 서로 같아야 일치한다고 말할 수 있다.
- 각각의 SELECT 명령의 열의 내용은 서로 일치해야 한다.
- SELECT 명령에서 집합의 요소가 될 데이터를 서로 맞춰주면 UNION으로 실행할 수 있다.
- SLECT * FORM table; 애스터리스크(*)를 쓰지 않고 열을 따로 지정해서 맞춰주기
UNION으로 묶을 때 나열 순서는 합집합의 결과에 영향을 주지 않는다. (결과가 모두 같다.)
- 단 결괏값의 나열순서는 달라질 수 있다.
ORDER BY를 지정하지 않은 SELECT 명령은 결과가 내부처리의 상황에 따라 바뀌기 때문이다.
UNION을 사용할 때에는 ORDER BY를 지정하는 방법에 주의해야 한다.
UNION을 사용할 때의 ORDER BY
UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정해 정렬할 수는 없다.
- ORDER BY를 지정할 때는 마지막 SELECT 명령에만 지정해야 한다.
- ORDER BY로 정렬할 수 없다는 뜻이 아니다.
- 합집합의 결과를 정렬하므로, 가장 마지막의 SELECT 명령에 ORDER BY를 지정해야 된다.
- 사실 밑에다 ORDER BY를 지정해줘도 쿼리에서 에러가 발생한다.
- 합집합 결과를 정렬해야 되기 때문에 두 개의 SELECT 명령에서 열 이름이 서로 일치해야 된다.
UNION으로 SELECT 명령을 연결하는 경우, 가장 마지막 SELECT 명령에 대해서만 ORDER BY 구를 지정할 수 있다.
- ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시켜야 된다.
UNION ALL
UNION은 합집합을 구하는 것이므로 두 개의 집합에서 겹치는 부분은 공통 요소가 된다.
- 실행 결과에 DISTINCT를 걸어 중복을 제거한 것과 같다.
- 수학에서 말하는 집합은 중복값이 존재하지 않는다는 것을 전재로 한다.
- UNION을 한 결과에도 중복값이 제거되어 있다.
중복을 제거하지 않고 2개의 SELECT 명령의 결과를 합치고 싶을 때도 있다.
- 이런 경우 UNION ALL을 사용한다.
SELECT 명령에서 중복을 제거하는 경우에는 DISTINCT, 중복을 제거하지 않고 모두를 반환하는 경우에는 ALL(기본값)을 지정했다.
- UNION의 기본 동작이 DISTINCT이기 때문에 모든 결과를 얻고 싶을 때는 ALL을 지정해야 한다.
- UNION DISTINCT라는 문법은 허용되지 않으므로 주의하자
- UNION에서는 이미 존재하는 값인지를 검사하는 처리가가 필요한 만큼, UNION ALL 쪽이 성능적으로는 유리할 수 있다.
- 중복값이 없는 경우에는 UNION ALL을 사용하는 편이 좋은 성능을 보여준다.
교집합과 차집합
MySQL에서는 지원되지 않는다.
- SQL을 이용해 교집합, 차집합도 구할 수 있다.
- 교집합은 INTERSECT를 차집합은 EXCEPT를(Oracle의 경우 MINUS) 사용한다.
- 같은 집합끼리 차집합을 계산할 경우 아무런 요소도 존재하지 않는 공집합이 된다.
- 차집합의 결과가 공집합인지 아닌지에 따라 두 개의 집합이 동일한지 아닌지를 알 수 있다.
- 공통부분이 존재하지 않으면 차집합을 구해도 결과는 바뀌지 않는다.
- 교집합은 두개의 집합이 겹치는 부분으로 ‘공통 부분’이라라 불린다.
'책 > SQL 첫걸음' 카테고리의 다른 글
트랜잭션 (0) | 2023.03.12 |
---|---|
복수의 테이블 다루기 (join) (0) | 2023.03.12 |
인덱스(index) (2) | 2023.03.12 |
뷰(view) (0) | 2023.02.24 |
상관 서브쿼리 (0) | 2023.02.24 |
집합 연산
관계형 모델에서의 관계형은 수학 집합론의 관계형 이론에서 유래했다.
- 데이터베이스의 데이터를 집합으로 간주해 다루기 쉽게 하자는 것
- SQL과 집합

원 안에 적혀있는 숫자가 요소에 해당한다.
- 데이터베이스에서는 테이블의 행이 요소에 해당한다.
- 행은 여러 개의 열로 구성되는 경우도 있으므로, 수치 상으로는 복수의 값이 존재한다.
- 집합의 요소라는 측면에서 보면 하나의 행이 곧 하나의 요소가 된다.
SELECT 명령을 실행하면 데이터베이스에 질의하며 그 결과 몇 개의 행이 반환된다. 반환된 결과 전체를 하나의 집합이라고 생각하면 된다.
UNION으로 합집합 구하기
2개의 집합A,B로 A = {1, 2, 3}, B = {2, 10, 11} 이라는 세개의 요소가 있을 때
2라는 요소는 A,B집합에 모두 존재한다. → 교집합
A,B의 합집합은 {1, 2, 3, 10, 11}이 된다.
- 단순하게 서로 더하면 {1, 2, 3, 2, 10, 11}과 같이 6개의 요소가 되지만 합집합에서는 그렇지 않는다.
UNION
SQL에서 집합을 계산할 때 문법
SELECT 명령의 실행 결과를 하나의 집합으로 다룰 수 있다.
- 합집합을 계산할 경우에는 수학에서 사용하던 U기호 대신 UNION 키워드를 사용한다.
- ‘A U B’는 SQL에서 ‘A UNION B’라고 표현한다. (A,B라고 했지만 실제로는 SELECT 명령)

SELECT 명령의 결과를 집합으로 간주하고 UNION으로 합집합을 구하면
SELECT * FROM a UNION SELECT * FROM b;
a |
1 |
2 |
3 |
10 |
11 |
두 개의 SELECT 명령을 하나의 명령으로 합치는 만큼, 세미클론은 맨 나중에 붙여야 된다.
- a 뒤에 세미콜론을 붙이면 도중에 명령이 끝나버려 제대로 실행이 안된다.
한 번의 쿼리 실행으로 두 개의 SELECT 명령이 내부적으로 실행되는 형식이다.
- 이때 각 SELECT 명령의 실행결과 (집합)를 합집합(UNION)으로 계산하여 최종적으로 결과를 반환한다.
- UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다.
- UNION을 이용하면 1+2+3..처럼 여러 개의 SELECT 명령을 하나로 묶을 수 있다.
- 각각의 SELECT 명령의 열의 내용은 서로 일치해야 한다.
- 열의 이름은 서로 다르더라도 열 개수와 자료형이 서로 같아야 일치한다고 말할 수 있다.
- 각각의 SELECT 명령의 열의 내용은 서로 일치해야 한다.
- SELECT 명령에서 집합의 요소가 될 데이터를 서로 맞춰주면 UNION으로 실행할 수 있다.
- SLECT * FORM table; 애스터리스크(*)를 쓰지 않고 열을 따로 지정해서 맞춰주기
UNION으로 묶을 때 나열 순서는 합집합의 결과에 영향을 주지 않는다. (결과가 모두 같다.)
- 단 결괏값의 나열순서는 달라질 수 있다.
ORDER BY를 지정하지 않은 SELECT 명령은 결과가 내부처리의 상황에 따라 바뀌기 때문이다.
UNION을 사용할 때에는 ORDER BY를 지정하는 방법에 주의해야 한다.
UNION을 사용할 때의 ORDER BY
UNION으로 SELECT 명령을 결합해 합집합을 구하는 경우, 각 SELECT 명령에 ORDER BY를 지정해 정렬할 수는 없다.
- ORDER BY를 지정할 때는 마지막 SELECT 명령에만 지정해야 한다.
- ORDER BY로 정렬할 수 없다는 뜻이 아니다.
- 합집합의 결과를 정렬하므로, 가장 마지막의 SELECT 명령에 ORDER BY를 지정해야 된다.
- 사실 밑에다 ORDER BY를 지정해줘도 쿼리에서 에러가 발생한다.
- 합집합 결과를 정렬해야 되기 때문에 두 개의 SELECT 명령에서 열 이름이 서로 일치해야 된다.
UNION으로 SELECT 명령을 연결하는 경우, 가장 마지막 SELECT 명령에 대해서만 ORDER BY 구를 지정할 수 있다.
- ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시켜야 된다.
UNION ALL
UNION은 합집합을 구하는 것이므로 두 개의 집합에서 겹치는 부분은 공통 요소가 된다.
- 실행 결과에 DISTINCT를 걸어 중복을 제거한 것과 같다.
- 수학에서 말하는 집합은 중복값이 존재하지 않는다는 것을 전재로 한다.
- UNION을 한 결과에도 중복값이 제거되어 있다.
중복을 제거하지 않고 2개의 SELECT 명령의 결과를 합치고 싶을 때도 있다.
- 이런 경우 UNION ALL을 사용한다.
SELECT 명령에서 중복을 제거하는 경우에는 DISTINCT, 중복을 제거하지 않고 모두를 반환하는 경우에는 ALL(기본값)을 지정했다.
- UNION의 기본 동작이 DISTINCT이기 때문에 모든 결과를 얻고 싶을 때는 ALL을 지정해야 한다.
- UNION DISTINCT라는 문법은 허용되지 않으므로 주의하자
- UNION에서는 이미 존재하는 값인지를 검사하는 처리가가 필요한 만큼, UNION ALL 쪽이 성능적으로는 유리할 수 있다.
- 중복값이 없는 경우에는 UNION ALL을 사용하는 편이 좋은 성능을 보여준다.
교집합과 차집합
MySQL에서는 지원되지 않는다.
- SQL을 이용해 교집합, 차집합도 구할 수 있다.
- 교집합은 INTERSECT를 차집합은 EXCEPT를(Oracle의 경우 MINUS) 사용한다.
- 같은 집합끼리 차집합을 계산할 경우 아무런 요소도 존재하지 않는 공집합이 된다.
- 차집합의 결과가 공집합인지 아닌지에 따라 두 개의 집합이 동일한지 아닌지를 알 수 있다.
- 공통부분이 존재하지 않으면 차집합을 구해도 결과는 바뀌지 않는다.
- 교집합은 두개의 집합이 겹치는 부분으로 ‘공통 부분’이라라 불린다.
'책 > SQL 첫걸음' 카테고리의 다른 글
트랜잭션 (0) | 2023.03.12 |
---|---|
복수의 테이블 다루기 (join) (0) | 2023.03.12 |
인덱스(index) (2) | 2023.03.12 |
뷰(view) (0) | 2023.02.24 |
상관 서브쿼리 (0) | 2023.02.24 |