JOIN
1
2
3
| SELECT 컬럼목록
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.공통컬럼 = 테이블2.공통컬럼;
|
LEFT JOIN (LEFT OUTER JOIN)
왼쪽 테이블(FROM절)의 모든 행 포함
1
2
3
4
5
6
7
8
9
10
11
12
13
| SELECT 컬럼목록
FROM 테이블1 -- 왼쪽 테이블 (모든 행 포함)
LEFT JOIN 테이블2 ON 조인조건;
-- 모든 국가와 도시 (도시 없어도 국가는 표시)
SELECT
co.Name AS 국가명,
ci.Name AS 도시명
FROM country co
LEFT JOIN city ci ON co.Code = ci.CountryCode
ORDER BY co.Name
LIMIT 20;
|
RIGHT JOIN (RIGHT OUTER JOIN)
오른쪽 테이블(JOIN 절)의 모든 행 포함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| SELECT 컬럼목록
FROM 테이블1
RIGHT JOIN 테이블2 ON 조인조건; -- 오른쪽 테이블 모든 행
-- 이 두 쿼리는 같은 결과
-- LEFT JOIN
SELECT ci.Name, co.Name
FROM city ci
LEFT JOIN country co ON ci.CountryCode = co.Code;
-- RIGHT JOIN (테이블 순서 바꿈)
SELECT ci.Name, co.Name
FROM country co
RIGHT JOIN city ci ON co.Code = ci.CountryCode;
|
FULL OUTER JOIN
MySQL은 FULL OUTER JOIN을 지원 하지 않음
- LEFT JOIN + RIGHT JOIN + UNION으로 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| SELECT
co.Name AS 국가명,
ci.Name AS 도시명
FROM country co
LEFT JOIN city ci ON co.Code = ci.CountryCode
UNION
SELECT
co.Name AS 국가명,
ci.Name AS 도시명
FROM country co
RIGHT JOIN city ci ON co.Code = ci.CountryCode
LIMIT 50;
|
SELF JOIN
같은 테이블을 자기 자신과 조인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| SELECT 컬럼목록
FROM 테이블 별칭1
INNER JOIN 테이블 별칭2 ON 조건;
SELECT
c1.Name AS 도시1,
c2.Name AS 도시2,
c1.Population AS 인구
FROM city c1
INNER JOIN city c2 ON c1.Population = c2.Population
AND c1.ID < c2.ID -- 중복 방지
ORDER BY c1.Population DESC
LIMIT 10;
|
c1.ID < c2.ID 의미:
- 자기 자신 제외
- (도시A, 도시B)와 (도시B, 도시A) 중복 제거
예제 :
1
2
3
4
5
6
7
8
9
10
| -- 같은 상영 시간(`length`)을 가진 영화 쌍을 찾으세요.
-- - 영화1 제목, 영화2 제목, 상영 시간, 상위 10개
select
f1.title, f2.title, f1.length
from film f1 inner join film f2
on f1.length = f2.length
order by f1.length desc
limit 10;
|
다중 JOIN
1
2
3
| SELECT 컬럼목록
FROM 테이블 별칭1
INNER JOIN 테이블 별칭2 ON 조건;
|
예제
1
2
3
4
5
6
7
8
9
10
| -- 영화와 카테고리를 조인하여 다음을 조회하세요:
-- - 영화 제목, 카테고리 이름, 대여료
select
f.title as film_title,
c.name as category_name,
f.rental_rate as 대여료
from film f
inner join film_category fc on f.film_id = fc.film_id
inner join category c on c.category_id = fc.category_id
;
|
- JOIN은 항상 “바로 이전까지 만들어진 결과 집합“과 JOIN 대상테이블을 연결 하는 것.
- 두번째 JOIN은 (film + film_category 조인 결과)와 category를 연결 한 것.
1
| film (f) ── film_id ── film_category (fc) ── category (c)
|
두 번째 JOIN의 ON 조건은 “첫 번째 JOIN 결과 안에 있는 fc.category_id 값과 category.category_id 값을 맞춰서 연결한다”는 뜻
✅ 핵심 개념: JOIN은 “누적”된다
SQL은 다음처럼 순차적으로 진행된다:
1
2
3
| 1) film f -- 첫 테이블
2) JOIN film_category fc -- f + fc 조인된 결과 집합
3) JOIN category c -- (f+fc) 결과와 c 조인
|