IT 성장일기
[SQL] 집합 연산자 본문
집합 연산자
모두의 SQL을 읽고 배운 것을 복습하기 위해 정리해서 기록합니다.
해당 도서는 Oracle 데이터베이스를 기준으로 하고 있습니다.
이번에는 테이블을 연계하여 데이터를 조회하는 다양한 방식에 대해 알아보겠습니다.
0. 집합 연산자 (Set operators)
집합 연산자는 SELECT 문 여러 개를 조건에 따라 붙여내어 결과를 합치거나 분리하는 방식입니다.
집합 연산자를 사용하는 데에는 몇 가지 문법적 제약이 있습니다.
- 첫 번째 SELECT 문에서 기술한 컬럼과 두 번째 SELECT 문에서 기술한 컬럼은 서로 순서대로 1:1로 대응됩니다.
즉, 컬럼의 개수는 물론이고 데이터 타입 또한 일치해야 합니다.
컬럼의 개수나 데이터 타입이 일치하지 않으면 어마어마한 오류를 내뿜으며 쿼리를 내팽개칩니다.
조금 비유를 해보자면 나의 수학, 과학, 국어 점수와 친구의 수학, 과학, 국어 점수를 비교하는 것이죠.
친구와 성적을 비교하는데 과목이 서로 다르면 뭔가 이상하겠죠?😊
- SELECT 문에 대한 연산은 위에서부터 순차적으로 수행됩니다.
첫 번째 SELECT 문을 조회한 후 UNION 연산자를 거쳐 n 번째 SELECT 문을 조회하는 식입니다.
- ORDER BY 절은 마지막 SELECT 문의 맨 끝에 기술합니다.
어차피 조회되는 컬럼은 같기 때문에 정렬은 한 번만 실시합니다.
집합 연산자의 종류는 아래와 같습니다.
- UNION
- UNION ALL
- INTERSET
- MINUS
아래의 테이블을 실습자료 삼아서 하나씩 알아보겠습니다. ㅎㅎ
TABLE_A | UNION UNION ALL INTERSECT MINUS |
TABLE_B | ||
column_a | column_b | column_a | column_b | |
1 | a | 1 | d | |
2 | b | 1 | e | |
3 | c | 4 | f |
1. UNION
UNION 집합은 두 개 이상의 SELECT 문을 조회한 결과를 하나로 묶어서 표시합니다. 즉 합집합입니다.
단, UNION 연산자는 중복되는 결과를 한 번만 출력합니다.
위의 테이블을 UNION 연산자로 묶어서 조회해 보겠습니다.
SELECT column_a, column_b
FROM TABLE_A
UNION
SELECT column_a, column_b
FROM TABLE_B
결과는 당연하게도 모든 행을 표시합니다.
두 개의 컬럼을 조회하기 때문에 column_a 값과 column_b 값이 모두 중복되는 경우를 제외하고 출력합니다.
만약 column_a 만을 UNION 하여 조회했다면 결괏값은 1, 2, 3, 4로 네 개의 행이 될 것입니다.
2. UNION ALL
UNION ALL 연산자는 UNION 연산자와 사용 방법을 같이합니다.
다만 한 가지 차이점이라면 중복되는 행까지 모두 출력합니다.
위의 테이블을 대상으로 중복되는 행이 존재하는 column_a 만을 조회하겠습니다.
SELECT column_a
FROM TABLE_A
UNION ALL
SELECT column_a
FROM TABLE_B
UNION 연산자와 달리 중복되는 행까지 모두 출력되는 것을 볼 수 있습니다.
3. INTERSECT
UNION 연산자가 합집합이었다면 INTERSET 연산자는 교집합을 의미합니다.
양쪽 SELECT 문의 결과에 대해 서로 공통되는 데이터만 표시합니다.
SELECT column_a
FROM TABLE_A
INTERSECT
SELECT column_a
FROM TABLE_B
column_a에서 겹치는 데이터는 1 뿐입니다.
SELECT column_b
FROM TABLE_A
INTERSECT
SELECT column_b
FROM TABLE_B
column_b의 교집합 결과처럼 겹치는 데이터가 없는 경우 위와 같이 빈 행을 반환합니다.
4. MINUS
MINUS 연산자는 다들 눈치채셨듯이 차집합 연산자입니다.
집합 A와 집합 B를 차집합 연산 했을 때 A에서 A와 B의 공통부분을 제외한 나머지를 반환하죠.
아래는 위의 테이블에서 column_a를 MINUS 연산한 결과입니다.
SELECT column_b
FROM TABLE_A
MINUS
SELECT column_b
FROM TABLE_B
종류 | 설명 | 집합 |
UNION | SELECT 문의 조회 결과를 합칩니다. 중복되는 행은 한번만 출력합니다. | 합집합 |
UNION ALL | SELECT 문의 조회 결과를 합칩니다. 중복되는 행 모두 출력합니다. | 합집합 |
INTERSECT | SELECT 문의 조회 결과에서 중복되는 부분만 출력합니다. | 교집합 |
MINUS | SELECT 문의 조회 결과에서 중복되는 부분을 제외한 나머지를 출력합니다. | 차집합 |
오늘은 여러 가지 집합연산자를 공부했습니다.
조인에 비해 단순한 것 같지만 여러 모로 유용하게 쓰이는 표현이니 잘 익혀놓으면 좋을 것 같습니다.
도움이 되어드렸다면 구독 / 좋아요 부탁드립니다.👏🏻
감사합니다.🙂
'Database > SQL' 카테고리의 다른 글
[SQL] Join (2) | 2023.11.04 |
---|---|
[SQL] 키와 제약 조건 (2) | 2023.11.04 |
[SQL] 함수 - 그룹 함수 (0) | 2023.11.04 |
[SQL] 함수 - 단일 행 함수 (2) (0) | 2023.11.02 |
[SQL] 함수 - 단일 행 함수 (1) (2) | 2023.10.23 |