[SolveSQL] 두 테이블 결합하기, SQL 조인(JOIN) 정리
SQL 기본 문법 : JOIN (INNER, OUTER, CROSS, SELF JOIN)
두 개의 테이블을 엮어야 하는 일이 정말 많은데, 그럴 때, JOIN을 사용하면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.
두 테이블의 조인을 위해, 일대다 관계로 기본키(PRIMARY KEY, PK)와 외래키(FOREIGN KEY, FK) 관계로 맺어져야 한다.
- INNER JOIN(내부 조인) : 두 테이블에 모두 일치하는 값이 있는 레코드를 반환
## INNER JOIN
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인 조건>
[WHERE 검색 조건]
JOIN의 기본값은 INNER JOIN 이다.(교집합에 해당하는 개념)
- OUTER JOIN : 1개의 테이블에만 데이터가 있어도 됨
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
종류가 3가지가 있는데,
- LEFT OUTER JOIN : 왼쪽 테이블의 모든 값과 오른쪽 테이블의 일치하는 값을 반환
= FROM “TABLE”에 초점을 맞춘 JOIN
- RIGHT OUTER JOIN : 오른쪽 테이블의 모든 값과 왼쪽 테이블의 일치하는 값 반환
= OUTER JOIN “TABLE”에 초점을 맞춘 JOIN
= LEFT OUTER JOIN과 거의 비슷한데, 그 방향성이 FROM에 있는지, JOIN에 있는지 차이다.
= 그래서 보통 실무에서 이 함수의 사용 빈도는 낮은 편이라고 한다.
- FULL OUTER JOIN : 왼쪽 또는 오른쪽 테이블에 일치하는 모든 값 반환
= 모든 데이터 조회를 위한 합집합 개념

- CROSS JOIN : 두 테이블의 모든 행을 조인
한쪽 테이블의 모든 행과 다른 테이블의 모든 행을 조인시키는 것
상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼으로, 카티션 곱(CARTESIAN PRODUCT)라고 한다.
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>
- SELF JOIN : 자기자신과 조인하는 것으로, 1개의 테이블만 사용
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]
## 두 테이블 결합하기
이 문제는 두 테이블을 JOIN을 사용하여 결합만 하면 되는 간단한 문제였는데,
틀린 이유로 쿼리의 결과 크기가 다르다고 해서 무슨 문제일까 했다.
GOLF 의 대회를 보니 단체전도 포함되어있었다.
그렇다면, 선수 ID 가 중복되는 부분이 있다는 것을 확인하고, 중복 제거를 하기 위해 “DISTINCT”을 추가해서 성공해줬다.
SELECT
DISTINCT athlete_id
FROM
records
join events
ON events.id == records.event_id
WHERE
sport == 'Golf'