이 글은 MySQL에서 쓰이는 외부 조인 개념, 종류,
유의점(FULL JOIN, UINION, UNION ALL), 문법, 예시를 담고 있습니다.
MySQL 외부 조인
외부 조인은 동시에 갖지 않는 값도 반환합니다.
이는 교집합(동시에 갖는 값)만 반환하는 내부 조인과 차이점입니다.
*이에 대한 추가 이해가 필요하다면, 아래 글을 참고해 주세요.
MySQL INNER JOIN(내부 조인) 다양한 문법과 예시
외부 조인 종류(LEFT, RIGHT, FULL OUTER JOIN)
외부 조인은 세 종류(LEFT, RIGHT, FULL)로 나뉩니다.
이때 OUTER는 생략 가능합니다.
LEFT JOIN(왼쪽 외부 조인)
왼쪽 외부 조인은 왼쪽 테이블을 기준으로 합니다.
왼쪽 테이블 A에 B를 결합하므로, A의 모든 값이 반환됩니다.
반면 B는 A와 교집합(동시에 갖는 값)인 값만 반환됩니다.
RIGHT JOIN(오른쪽 외부 조인)
오른쪽 외부 조인은 왼쪽 외부 조인의 반대로, 오른쪽 테이블이 기준입니다.
오른쪽 테이블 B에 A를 결합하므로, B의 모든 값은 반환됩니다.
한편 A는 B와 교집합인 값만 반환됩니다.
FULL JOIN(전체 외부 조인)
전체 외부 조인은 LEFT JOIN+RIGHT JOIN입니다.
왼쪽, 오른쪽 테이블(A, B)의 모든 값을 반환하는 합집합입니다.
MySQL FULL OUTER JOIN 유의점, UNION, UNION ALL
MySQL은 외부 조인 중 FULL JOIN을 미지원합니다.
그래서 FULL JOIN과 같은 역할인 UNION을 사용합니다.
UNION은 DISTINCT로, 중복 제외 값을 반환합니다.
만약 중복 값도 원한다면 UNION ALL을 사용합니다.
*DISTINCT 관련 글 추천 MySQL 중복 제거 DISTINCT 쉬운 사용법 예시
MySQL 외부 조인 문법(LEFT, RIGHT JOIN, UNION, UNION ALL)
JOIN들의 기본은 결합할 테이블들 간 공통키가 있어야 한다는 것입니다.
또한 외부 조인의 기준 테이블이 결합될 테이블과 동시에 갖는 값이 없다면, NULL값이 반환됩니다.
LEFT, RIGHT JOIN
둘 다 기본 문법은 같으며, OUTER는 생략 가능합니다.
그러므로 아래처럼 LEFT, RIGHT 중 선택 입력하면 됩니다.
*다양한 조인 문법을 원하신다면, 아래 글을 참고해 주세요.
MySQL 다중 내부 조인(INNER JOIN 여러 개) 문법, 예시
SELECT 테이블1.컬럼명1, 테이블2.컬럼명2
FROM 테이블1 LEFT | RIGHT (OUTER) JOIN 테이블2
ON 테이블1.공통키=테이블2.공통키;
UINON, UNION ALL (=FULL JOIN)
UINON은 FULL JOIN이 합집합이라는 점을 이해하면 됩니다.
따라서 LEFT JOIN과 RIGHT JOIN 사이에 UNION, UINON ALL 중 선택 입력합니다.
SELECT 테이블1.컬럼명1, 테이블2.컬럼명2
FROM 테이블1 LEFT JOIN 테이블2
ON 테이블1.공통키=테이블2.공통키
UION | UINON ALL
SELECT 테이블1.컬럼명1, 테이블2.컬럼명2
FROM 테이블1 RIGHT JOIN 테이블2
ON 테이블1.공통키=테이블2.공통키;
ALIAS
가시성과 가독성을 위해 테이블명을 별칭(AS)으로 표현할 수 있습니다.
이때 AS는 띄어쓰기로 대체 가능합니다.
*별칭 관련 추천 글 MySQL 별칭 ALIAS 사용 방법, 규칙, 차이점
SELECT 별칭1.컬럼명1, 별칭2.컬럼명2
FROM 테이블1 AS 별칭1 LEFT (OUTER) JOIN 테이블2 별칭2
ON 별칭1.공통키=별칭2.공통키;
MySQL 외부 조인 예시
TABLE
왼쪽 테이블(고객정보), 오른쪽 테이블(주문정보)이 있습니다.
두 테이블의 공통키는 ID지만, 왼쪽 테이블의 ID7823은 오른쪽 테이블에 없습니다.
또한 오른쪽 테이블의 ID20301은 왼쪽 테이블에 없습니다.
고객정보 | |
ID | 지역 |
451 | 서울시 강남구 |
7832 | 서울시 영등포구 |
9111 | 서울시 중구 |
주문정보 | ||
ID | 주문제품번호 | 주문일 |
451 | F2 | 2023-01-01 |
9111 | FN17 | 2023-02-02 |
20301 | FJ8 | 2023-03-03 |
LEFT JOIN
*SELECT문에서는 테이블 간 중복 컬럼명 없을 경우, 테이블명 생략 가능합니다.
SELECT a.ID, 지역, 주문제품번호, 주문일
FROM 고객정보 a
LEFT JOIN 주문정보 b
ON a.ID = b.ID;
LEFT JOIN 산출물
기준 테이블인 왼쪽(고객정보)에 오른쪽 테이블(주문정보)의 결합입니다.
1. 기준인 왼쪽 테이블의 모든 값이 반환됩니다.
2. 기준인 왼쪽 테이블의 ID7832의 데이터가 오른쪽에 없으므로, NULL 값이 반환됩니다.
3. 오른쪽 테이블의 ID20301은 기준인 왼쪽 테이블에 없으므로, 표시되지 않습니다.
ID | 지역 | 주문제품번호 | 주문일 |
451 | 서울시 강남구 | F2 | 2023-01-01 |
7832 | 서울시 영등포구 | ||
9111 | 서울시 중구 | FN17 | 2023-02-02 |
RIGHT JOIN
SELECT a.ID, 지역, 주문제품번호, 주문일
FROM 고객정보 a
RIGHT JOIN 주문번호 b
ON a.ID = b.ID;
RIGHT JOIN 산출물
LEFT JOIN의 반대로 생각하면 됩니다.
1. 기준인 오른쪽 테이블의 모든 값이 반환됩니다.
2. 기준인 오른쪽 테이블의 ID20301의 데이터가 왼쪽에 없으므로, NULL 값이 반환됩니다.
3. 왼쪽 테이블의 ID7832는 기준인 오른쪽 테이블에 없으므로, 표시되지 않습니다.
ID | 지역 | 주문제품번호 | 주문일 |
451 | 서울시 강남구 | F2 | 2023-01-01 |
9111 | 서울시 중구 | FN17 | 2023-02-02 |
20301 | FJ8 | 2023-03-03 |
UINION
SELECT a.ID, 지역, 주문제품번호, 주문일
FROM 고객정보 a
LEFT JOIN 주문번호 b
ON a.ID = b.ID
UNION
SELECT a.ID, 지역, 주문제품번호, 주문일
FROM 고객정보 a
RIGHT JOIN 주문번호 b
ON a.ID = b.ID;
UNION 산출물
UNION은 중복 없이 RIGHT JOIN+LEFT JOIN 값과 NULL값을 반환합니다.
ID | 지역 | 주문제품번호 | 주문일 |
451 | 서울시 강남구 | F2 | 2023-01-01 |
7832 | 서울시 영등포구 | ||
9111 | 서울시 중구 | FN17 | 2023-02-02 |
20301 | FJ8 | 2023-03-03 |
UNION ALL 산출물
UNION ALL은 중복을 포함하고 RIGHT JOIN+LEFT JOIN 값과 NULL값을 반환합니다.
*UNION ALL 명령문은 UNION을 UNION ALL로 바꾸면 되므로 생략합니다.
ID | 지역 | 주문제품번호 | 주문일 |
451 | 서울시 강남구 | F2 | 2023-01-01 |
7832 | 서울시 영등포구 | ||
9111 | 서울시 중구 | FN17 | 2023-02-02 |
451 | 서울시 강남구 | F2 | 2023-01-01 |
9111 | 서울시 중구 | FN17 | 2023-02-02 |
20301 | FJ8 | 2023-03-03 |
'SQL > MySQL' 카테고리의 다른 글
MySQL 날짜 함수 YEAR() 설명, 문법, 예시 (0) | 2023.09.20 |
---|---|
MySQL 자주 쓰는 숫자 데이터 타입(Numeric Data Types) 간단 정리 (0) | 2023.09.18 |
MySQL 다중 내부 조인(INNER JOIN 여러 개) 문법, 예시 (2) | 2023.09.14 |
MySQL INNER JOIN(내부 조인) 다양한 문법과 예시 (0) | 2023.09.12 |
MySQL 집계 함수, GROUP BY와 HAVING 사용 방법 (0) | 2023.09.11 |