본문 바로가기

Server/DB

코테 준비를 위한 SQL 첫걸음 정리 - 복수의 테이블 다루기 [ 집합 연산, 조인 ]

1. 집합 연산

SQL에서 집합 연산은 여러 SELECT 문에서 반환된 결과를 하나로 결합할 때 사용된다.

대표적인 연산으로 합집합 (UNION), 교집합 (INTERSECT), 차집합 (EXCEPT)이 있다.

 

1.1 합집합 (UNION)

UNION 연산은 두 개 이상의 SELECT 문에서 반환된 결과를 합치며, 중복된 값은 자동으로 제거된다.

예제 테이블

테이블 A

id name
1 Alice
2 Bob
3 Charlie

테이블 B

id name
3 Charlie
4 David
5 Eva

UNION 사용 예시

SELECT name FROM A
UNION
SELECT name FROM B;

두 테이블의 데이터 합친 후 중복 제거

name
Alice
Bob
Charlie
David
Eva
더보기
WITH hours AS (
    SELECT 0 AS hour, 0 AS count UNION ALL
    SELECT 1, 0 UNION ALL
    SELECT 2, 0 UNION ALL
    SELECT 3, 0 UNION ALL
    SELECT 4, 0 UNION ALL
    SELECT 5, 0 UNION ALL
    SELECT 6, 0 UNION ALL
    SELECT 7, 0
)
hour count
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0

🔍 UNION vs UNION ALL 차이

구분 UNION UNION ALL
중복 제거 ✅ 중복된 행을 제거함 (DISTINCT 동작 포함) ❌ 중복 제거 안 함
속도 느림 (정렬 및 중복 제거 비용 발생) 빠름 (그냥 합치기만 함)
용도 중복되면 안 되는 결과를 원할 때 중복이 문제되지 않거나, 의도적으로 중복 포함할 때

 

1.2 교집합 (INTERSECT)

INTERSECT 연산은 두 개 이상의 SELECT 문에서 공통으로 존재하는 행만 반환한다.

INTERSECT 사용 예시

SELECT name FROM A
INTERSECT
SELECT name FROM B;

두 테이블에 공통으로 존재하는 데이터 필터링

name
Charlie

 

1.3 차집합 (EXCEPT)

EXCEPT 연산은 첫 번째 SELECT 문에서 반환된 결과에서 두 번째 SELECT 문에서 반환된 행을 제외한 결과를 반환한다.

EXCEPT 사용 예시

SELECT name FROM A
EXCEPT
SELECT name FROM B;

A에서 B에 존재하는 데이터를 제외한 결과

name
Alice
Bob

 

2. 테이블 결합 (JOIN)

테이블 결합은 두 개 이상의 테이블에서 데이터를 결합하는 방법이다.

대표적인 JOIN 방식으로 교차 결합 (CROSS JOIN), 내부 결합 (INNER JOIN), 외부 결합 (LEFT JOIN / RIGHT JOIN)이 있다.

 

2.1 교차 결합 (CROSS JOIN)

CROSS JOIN은 두 개의 테이블의 모든 조합을 반환한다.

CROSS JOIN 사용 예시

SELECT * FROM A
CROSS JOIN B;

 

2.2 내부 결합 (INNER JOIN)

INNER JOIN은 두 테이블에서 조건을 만족하는 행만 반환한다.

INNER JOIN 사용 예시

SELECT A.id, A.name, B.id, B.name 
FROM A
INNER JOIN B ON A.id = B.id;

 

A.id A.name B.id B.name
3 Charlie 3 Charlie

 

2.3 외부 결합 (LEFT JOIN / RIGHT JOIN)

  • LEFT JOIN: 왼쪽 테이블의 모든 행을 반환하고, 일치하는 오른쪽 테이블의 데이터가 없으면 NULL을 반환한다.
  • RIGHT JOIN: 오른쪽 테이블의 모든 행을 반환하고, 일치하는 왼쪽 테이블의 데이터가 없으면 NULL을 반환한다.

LEFT JOIN 사용 예시

SELECT A.id, A.name, B.id, B.name 
FROM A
LEFT JOIN B ON A.id = B.id;

 

A의 모든 행을 유지하고, 일치하는 B의 데이터가 없으면 NULL 반환

A.id A.name B.id B.name
1 Alice NULL NULL
2 Bob NULL NULL
3 Charlie 3 Charlie

RIGHT JOIN 사용 예시

SELECT A.id, A.name, B.id, B.name 
FROM A
RIGHT JOIN B ON A.id = B.id;

 

B의 모든 행을 유지하고, 일치하는 A의 데이터가 없으면 NULL 반환 

A.id A.name B.id B.name
3 Charlie 3 Charlie
NULL NULL 4 David
NULL NULL 5 Eva