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 |