JOIN
- 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
- 관련된 필드들을 기준으로 결합
- MySQL에서는
JOIN
명령어로 두 테이블을 결합할 수 있으며 이 때 결합 조건은 ON
명령어로 줌
JOIN의 종류
- INNER JOIN(내부 조인)
- 결합 조건을 만족하는 데이터만 선택해 두 테이블 결합
- 두 테이블 모두 지정한 열의 데이터가 있어야 함
- OUTER JOIN(외부 조인)
- 결합 조건을 만족하지 않아도 종류에 따라 특정 데이터를 모두 선택해 두 테이블 결합
- 1개의 테이블에만 데이터가 있어도 결과 나옴
- LEFT JOIN
- 첫 번째 테이블의 데이터를 모두 선택한 후, 두 번째 테이블의 데이터를 결합 조건에 따라 매칭
- 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
- RIGHT JOIN
- 두 번째 테이블의 데이터를 모두 선택한 후, 첫 번째 테이블의 데이터를 결합 조건에 따라 매칭
- 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
- FULL OUTER JOIN
- 두 테이블의 데이터를 모두 선택하고 결합 조건에 따라 데이터 매칭
- 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
- MySQL에서는 FULL OUTER JOIN 명령어를 지원하지 않으므로
LEFT JOIN
과 RIGHT JOIN
을 UNION
하여(합집합을 구해) 사용할 수 있음
SELECT *
FROM a
LEFT JOIN b
UNION
SELECT *
FROM a
RIGHT JOIN b;
UNION
은 중복 제외(DISTINCT) 출력이 디폴트
UNION
과 UNION ALL
은 칼럼명이 동일해야 함
- 같지 않을 경우에는 별칭(alias)을 사용해 같게 해주어야 함
- 칼럼별 데이터타입 또한 모두 같아야 함
- CROSS JOIN(상호 조인)
- 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인하는 기능
- 상호 조인 결과의 전체 행 수는 두 테이블의 각 행의 개수를 곱한 수만큼 됨
- 카티션 곱(CARTESIAN PRODUCT)이라고도 함
- SELF JOIN(자체 조인)
- 자신이 자신과 조인한다는 의미로, 1개의 테이블을 사용
- 별도의 문법이 있는 건 아니고 1개로 조인하면 자체 조인이 됨
예시
Residents: A마을 거주자
id | name | pet_id |
---|
1 | Maria | 1 |
2 | Erin | NULL |
3 | Rafael | 3 |
4 | Eugene | 2 |
Animals: A마을에 사는 동물
id | name | species | |
---|
1 | Momo | cat | 1 |
2 | Jindol | dog | 4 |
3 | Nabi | cat | NULL |
4 | Choco | dog | NULL |
5 | Reo | dog | 3 |
INNER JOIN
- 결합 조건을 만족하는 데이터만 선택해 두 테이블 결합
- MySQL에서는
JOIN
명령어를 이용해 구현
- INNER JOIN을 이용해
residents
, animals
테이블에서 주인 이름과 반려동물 이름 조합들을 출력할 수 있음
SELECT residents.name AS owener_name, animals.name AS pet_name
FROM residents JOIN animals ON residents.id = animals.owner_id;
owner_name | pet_name |
---|
Maria | Momo |
Eugene | Jindol |
Rafael | Reo |
OUTER JOIN
- 결합 조건을 만족하지 않아도 그 종류에 따라 특정 테이블의 데이터를 모두 선택에 두 테이블을 결합
- LEFT JOIN(LEFT OUTER JOIN)
- 첫 번째 테이블의 데이터를 모두 선택한 후, 두 번째 테이블의 데이터를 결합 조건에 따라 매칭
- 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
- MySQL에서는
LEFT JOIN
명령어를 이용
SELECT residents.name AS resident_name, animal.name AS pet_name
FROM residents LEFT JOIN animals ON residents.id = animals.owner_id;
SELECT residents.name AS resident_name, animal.name AS pet_name
FROM residents LEFT OUTER JOIN animals ON residents.id = animals.owner_id;
resident_name | pet_name |
---|
Maria | Momo |
Erin | NULL |
Rafael | Reo |
Eugene | Jindol |
- RIGHT JOIN(RIGHT OUTER JOIN)
- 두 번째 테이블의 데이터를 모두 선택한 후, 첫 번째 테이블의 데이터를 결합 조건에 따라 매칭
- 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
- MySQL에서는
RIGHT JOIN
명령어를 이용해 구현
- LEFT JOIN과 RIGHT JOIN은 데이터를 모두 출력하는 테이블만 다르기 때문에
a LEFT JOIN b
는 b RIGHT JOIN a
와 같음
SELECT animals.name AS animal_name, residents.name AS owner_name
FROM residents RIGHT JOIN animals ON residents.pet_id = animals.id;
SELECT animals.name AS animal_name, residents.name AS owner_name
FROM residents RIGHT OUTER JOIN animals ON residents.pet_id = animals.id;
SELECT animals.name AS animal_name, residents.name AS owner_name
FROM animals LEFT JOIN residents ON animals.id = residents.pet_id;
animal_name | owner_name |
---|
Momo | Maria |
Jindol | Eugene |
Nabi | NULL |
Choco | NULL |
Reo | Rafael |
- FULL OUTER JOIN
- 두 테이블의 데이터를 모두 선택하고, 결합 조건에 따라 데이터를 매칭
- 매칭되는 데이터가 없는 경우 그 값을 NULL로 표시
- 두 테이블의 합집합 결과와 같음
- MySQL에서는 FULL OUTER JOIN을 구현하기 위한 명령어를 기본적으로 제공하지 않기 때문에 LEFT JOIN과 RIGHT JOIN의 합집합을 구해 FULL OUTER JOIN의 값을 얻을 수 있음
SELECT residents.name AS resident_name, animal.name AS pet_name
FROM residents LEFT JOIN animals ON residents.id = animals.owner_id
UNION
SELECT animals.name AS animal_name, residents.name AS owner_name
FROM residents RIGHT JOIN animals ON residents.pet_id = animals.id;
resident_name | animal_name |
---|
Maria | Momo |
Erin | NULL |
Rafael | Reo |
Eugene | Jindol |
NULL | Nabi |
NULL | Choco |
- 정리
- INNER JOIN: 주인-반려동물 조합
- OUTER JOIN
- LEFT JOIN: 거주민-반려동물 조합
- RIGHT JOIN: 동물-주인 조합
- FULL OUTER JOIN: 거주민-동물 조합