본문 바로가기
DB/DB 문법

JOINS와 집합 연산자

by oneny 2023. 5. 16.
JOIN은 여러 개의 테이블을 결합할 수 있도록 해주는 기능이다.

 

INNER JOIN

직접 그림

INNER JOIN은 두 테이블을 충족하는 레코드 세트를 결과로 출력한다.

 

SELECT * FROM table_a
INNER JOIN table_b
ON table_a.col_match = table_b.col_match;

SELECT * FROM table_b
INNER JOIN table_a
ON table_a.col_match = table_b.col_match;

SELECT *
FROM table_a, table_b
WHERE table_a.col_match = table_b.col_match;

INNER JOIN에서는 테이블의 순서가 중요하지 않다. 또한, JOIN에 INNER 키워드가 없는 경우 PostgreSQL은 INNER JOIN으로 처리한다.

 

FULL OUTER JOIN

직접 그림

SELECT * FROM table_a
FULL OUTER JOIN table_b
ON table_a.col_match = table_b.col_match;

SELECT * FROM table_b
FULL OUTER JOIN table_a
ON table_a.col_match = table_b.col_match;

벤다이어그램이 대칭이기 때문에 테이블 순서를 바꿔도 같은 결과가 나온다.

 

앞으로 사용할 테이블 예시

REGISTRATION  
reg_id name
1 Andrew
2 Bob
3 Charlie
4 Davie
LOGINS  
1 Xavier
2 Andrew
3 Yolanda
4 Bob

 

FULL OUTER JOIN Example

SELECT * FROM registration FULL OUTER JOIN logins
ON registration.name = logins.name;
RESULTS      
reg_id name log_id name
1 Andrew 2 Andrew
2 Bob 4 Bob
3 Charlie null null
4 David null null
null null 1 Xavier
null null 3 Yolanda

 

FULL OUTER JOIN with WHERE

직접 그림

SELECT * FROM table_a
FULL OUTER JOIN table_b
ON table_a.col_match = table_b.col_match
WHERE table_a.id IS NULL OR table_b.id IS NULL;

기본적으로 INNER JOIN과 정반대되는 개념이다. 두 테이블 모두에 고유한 행(두 테이블 모두에서 찾을 수 없는 행)을 가져올 수 있다.

 

SELECT * FROM registrations
FULL OUTER JOIN logins
ON registrations.name = logins.name
WHERE registrations.reg_id IS NULL OR logins.log_id IS NULL;
RESULTS      
reg_id name log_id name
3 Charlie null null
4 David null null
null null 1 Xavier
null null 3 Yolanda

 

LEFT OUTER JOIN

SELECT * FROM table_a
LEFT OUTER JOIn table_b
ON table_a.col_match = table_b.col_match;

LEFT OUTER JOIN은 왼쪽 테이블에 있는 레코드 집합을 생성한다.

테이블 A에서 정보를 가져올 것인데 이 정보 중에서 테이블 A에만 해당하는 것도 있고, 테이블 B에 있는 것 중 테이블 A와 겹치는 부분만 가져온다. 즉, 오른쪽 테이블과 일치하지 않는 경우, 결과는 null 이다.

 

LEFT OUTER JOIN Example

SELECT * FROM registrations
LEFT OUTER JOIN logins
ON registrations.name = logins.name;
RESULTS      
reg_id name log_id name
1 Andrew 2 Andrew
2 Bob 4 Bob
3 Charlie null null
4 David null null

 

LEFT OUTER JOIN with WHERE

SELECT * FROM table_a
LEFT OUTER JOIN table_b
ON table_a.col_match = table_b.col_match
WHERE table_b.id IS NULL;

SELECT * FROM registrations
LEFT OUTER JOIN logins
ON registrations.name = logins.name
WHERE logins.log_id IS NULL;

만약 테이블 A에만 고유한 레코드를 원하는 경우에 위의 쿼리 예시처럼 명령하면 왼쪽 테이블에 고유한 행만 가져올 수 있다.

RESULTS      
reg_id name log_id name
3 Charlie null null
4 David null null

 

RIGHT JOIN

SELECT * FROM table_a
RIGHT OUTER JOIN table_b
ON table_a.col_match = table_b.col_match;

RIGHT OUTER JOIN은 테이블이 전환된다는 점을 제외하고 LEFT OUTER JOIN과 동작방식이 동일하다.

이는 LEFT OUTER JOIN에서 테이블 순서를 전환하는 것과 동일하다.

 

RIGHT OUTER JOIN with WHERE

SELECT * FROM table_a
RIGHT OUTER JOIN table_b
ON table_a.col_match = table_b.col_match
WHERE table_a.id IS NULL;

 

집합 연산자

여러 질의(SELECT 문) 결과를 하나로 결합하기 위해 사용한다.

집한 연산의 대상이 되는 두 질의는..

  • SELECT 절의 컬럼 수가 동일해야 하고
  • SELECT 절의 동일 위치에 존재하는 컬럼의 데이터 타입이 상호 호환 가능해야 한다.
    • 반드시 동일한 데이터 타입일 필요는 없다.
집합 연산자 연산자 의미
UNION 여러 SQL문의 결과에 대한 합집합
(중복된 행은 제거한 후 하나의 행만 출력)
UNION ALL 여러 SQL문의 결과에 대한 합집합
(중복된 행도 삭제하지 않고 모두 출력
    -> 속도가 빠르므로 우선 고려)
INTERSECT 여러 SQL문의 결과에 대한 교집합
(중복된 행은 제거한 후 하나의 행만 출력)
EXCEPT 앞의 SQL문의 결과에서 뒤의 SQL문의 결과를 뺀 차집합
(중복된 행은 제거한 후 하나의 행만 출력)

 

UNION

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION 연산자를 사용하면 2개 이상의 SELECT 문의 결과 세트를 결합할 수 있다. JOIN과 UNION의 차이는 UNION은 두 결과를 직접 붙인 것이다. 두 SELECT 문의 결과를 서로의 바로 위에 붙여준다.

'DB > DB 문법' 카테고리의 다른 글

쿼리 조회 시 *(asterisk)는 정말 지양해야 할까?  (0) 2023.05.18
데이터베이스 및 테이블 생성  (0) 2023.05.18
서브쿼리(Sub Query)  (1) 2023.05.16
시간 데이터 유형  (0) 2023.05.16
GROUP BY와 집계 함수  (0) 2023.05.15