Post

JOIN

JOIN

  • 여러 테이블의 데이터를 연결 하여 조회
1
2
3
SELECT 컬럼목록
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.공통컬럼 = 테이블2.공통컬럼;
  • 그냥 JOIN이라고 써도 된다

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 조인
This post is licensed under CC BY 4.0 by the author.