[Day 12 | DB] 데이터베이스 집합 연산

y♡ding·2024년 10월 29일
0

데브코스 TIL

목록 보기
81/163

데이터베이스 집합 연산은 SQL에서 두 개 이상의 쿼리 결과 집합을 결합하여 하나의 결과로 출력하는 연산입니다. 이를 통해 여러 쿼리 결과를 합치거나 중복을 제거할 수 있습니다.


UNION 합집합

  • 두 쿼리의 결과 집합을 합집합으로 결합하여 반환합니다.
  • 기본적으로 중복된 행은 제거합니다.

  • 구문:
SELECT 컬럼명 FROM 테이블1
UNION
SELECT 컬럼명 FROM 테이블2;
  • UNION ALL: 중복 행도 포함하여 모든 결과를 반환하려면 UNION ALL을 사용합니다.
SELECT 컬럼명 FROM 테이블1
UNION ALL
SELECT 컬럼명 FROM 테이블2;

INTERSECT 교집합

  • 두 쿼리의 결과 집합 중에서 공통된 행만 반환합니다.
  • 중복된 값이 제거된 결과를 반환합니다.

  • 구문:

SELECT 컬럼명 FROM 테이블1
INTERSECT
SELECT 컬럼명 FROM 테이블2;
  • 주의: INTERSECT는 MySQL에서 기본적으로 지원하지 않으므로 MySQL을 사용하는 경우 INNER JOIN이나 EXISTS 절을 사용하여 대체해야 합니다.
SELECT 테이블1.1, 테이블1.2, ...
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.1 = 테이블2.1;

EXCEPT (차집합)

  • 첫 번째 쿼리의 결과 집합에서 두 번째 쿼리의 결과 집합에 포함되지 않은 행만 반환합니다. (차집합)

  • 구문:
SELECT 컬럼명 FROM 테이블1
EXCEPT
SELECT 컬럼명 FROM 테이블2;

MariaDB에서는 EXCEPT를 지원하지 않으므로, LEFT JOIN을 사용하여 하나의 테이블에는 존재하지만 다른 테이블에는 없는 데이터를 반환하도록 구현합니다.

SELECT 테이블1.1, 테이블1.2, ...FROM 테이블1
LEFT JOIN 테이블2 ON 테이블1.1 = 테이블2.1
WHERE 테이블2.1 IS NULL;

예제

  • 기본 세팅
MariaDB [sample]> select * from t1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+

MariaDB [sample]> select * from t2;
+----+
| id |
+----+
|  2 |
|  3 |
|  4 |
+----+

1. UNION 예제 (합집합)

두 테이블 t1t2id 값을 합집합으로 결합하고, 중복된 값을 제거하여 출력합니다.

SELECT id FROM t1
UNION
SELECT id FROM t2;

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
  • t1t2에 모두 있는 23은 중복을 제거하고 한 번만 출력됩니다.

2. UNION ALL 예제 (중복 포함 합집합)

두 테이블 t1t2id 값을 중복을 포함하여 합집합으로 결합합니다.

SELECT id FROM t1
UNION ALL
SELECT id FROM t2;

+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  2 |
|  3 |
|  4 |
+----+

결과:

  • 23t1t2에 모두 포함되어 있으므로, 중복된 값이 그대로 포함됩니다.

3. 교집합 구현 (INTERSECT 대체)

MariaDB에서는 INTERSECT가 지원되지 않으므로, INNER JOIN을 사용하여 두 테이블의 공통 값을 찾습니다.

SELECT t1.id
FROM t1
INNER JOIN t2 ON t1.id = t2.id;

+----+
| id |
+----+
|  2 |
|  3 |
+----+
  • t1t2에 공통으로 존재하는 id 값만 반환합니다.

4. 차집합 구현 (EXCEPT 대체)

MariaDB에서 EXCEPT가 지원되지 않으므로, LEFT JOIN을 사용하여 t1에만 존재하고 t2에는 없는 값을 찾는 방식으로 구현합니다.

  • t1에만 있고 t2에는 없는 값 (차집합)
SELECT t1.id
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t2.id IS NULL;
  • t2에만 있고 t1에는 없는 값 (차집합)
SELECT t2.id
FROM t2
LEFT JOIN t1 ON t2.id = t1.id
WHERE t1.id IS NULL;

+----+
| id |
+----+
|  1 |
+----+
  • t2에는 있고 t1에는 없는 id 값을 반환합니다.

0개의 댓글

관련 채용 정보