Skip to main content
Puri๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” INNER JOIN, LEFT JOIN, ๊ทธ๋ฆฌ๊ณ  ๋ณต์žกํ•œ ์กฐ์ธ ํŒจํ„ด์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์กฐ์ธ ๊ฐœ์š”

INNER JOIN

์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ join()

LEFT JOIN

์™ผ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€, ์˜ค๋ฅธ์ชฝ์€ Optional leftJoin()

Self JOIN

๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ์กฐ์ธ alias ์‚ฌ์šฉ

M:N JOIN

๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ์กฐ์ธ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ํ™œ์šฉ

INNER JOIN

์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ JOIN

INNER JOIN ์‚ฌ์šฉ ์‹œ๊ธฐ: - ๊ด€๊ณ„๊ฐ€ ํ•„์ˆ˜์ธ ๊ฒฝ์šฐ (NOT NULL ์™ธ๋ž˜ ํ‚ค) - ์–‘์ชฝ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ - ์˜ˆ: ์ง์› โ†’ ์‚ฌ์šฉ์ž (๋ชจ๋“  ์ง์›์€ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž ๊ณ„์ •์ด ์žˆ์Œ)

์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ” JOIN

LEFT JOIN

์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์€ ์žˆ์œผ๋ฉด ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ LEFT JOIN

LEFT JOIN ์‚ฌ์šฉ ์‹œ๊ธฐ: - ๊ด€๊ณ„๊ฐ€ ์„ ํƒ์ ์ธ ๊ฒฝ์šฐ (NULLABLE ์™ธ๋ž˜ ํ‚ค) - ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ - ์˜ˆ: ์ง์› โ†’ ๋ถ€์„œ (์ผ๋ถ€ ์ง์›์€ ๋ถ€์„œ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์Œ)

INNER JOIN vs LEFT JOIN ๋น„๊ต

๋ณตํ•ฉ LEFT JOIN

INNER + LEFT JOIN ํ˜ผํ•ฉ

ํ•„์ˆ˜ ๊ด€๊ณ„๋Š” INNER JOIN, ์„ ํƒ ๊ด€๊ณ„๋Š” LEFT JOIN์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์กฐ์ธ ํƒ€์ž… ์„ ํƒ ๊ฐ€์ด๋“œ: 1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ํ™•์ธ (NOT NULL vs NULLABLE) 2. NOT NULL ์™ธ๋ž˜ ํ‚ค โ†’ INNER JOIN 3. NULLABLE ์™ธ๋ž˜ ํ‚ค โ†’ LEFT JOIN 4. ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ๊ณ ๋ ค

๊ธฐ์กด JOIN ์žฌ์‚ฌ์šฉ

Subset ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€ํ–ˆ์„ ์ˆ˜ ์žˆ๋Š” JOIN์„ Model์—์„œ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ensureJoin() ๋˜๋Š” ensureLeftJoin()์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Puri๋Š” alias๋ฅผ ๊ธฐ์ค€์œผ๋กœ JOIN์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. alias, ํ…Œ์ด๋ธ”, JOIN ํƒ€์ž…, ์™ผ์ชฝ ์ปฌ๋Ÿผ, ์˜ค๋ฅธ์ชฝ ์ปฌ๋Ÿผ์ด ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ๊ธฐ์กด JOIN์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ , alias๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ JOIN์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ alias์— ๋‹ค๋ฅธ ์ •์˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ์‹คํ–‰ ์ „์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฌผ๋ฆฌ ํ…Œ์ด๋ธ”๋„ alias๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ๊ฐ JOINํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ensureJoin()๊ณผ ensureLeftJoin()์€ ํ…Œ์ด๋ธ”์˜ ๋‹จ์ˆœ ์ปฌ๋Ÿผ ๋™๋“ฑ JOIN๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. callback ๋˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ JOIN์€ ๊ธฐ์กด์ฒ˜๋Ÿผ join()๊ณผ leftJoin()์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์žฌ์‚ฌ์šฉ ๋Œ€์ƒ์œผ๋กœ ํŒ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Self JOIN - ์ž๊ธฐ ์ฐธ์กฐ

๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ๋Š” **๋ณ„์นญ(alias)**์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์„œ ๊ณ„์ธต๊ตฌ์กฐ ์˜ˆ์ œ

๊ฒฐ๊ณผ ์˜ˆ์‹œ:

์‚ฌ์šฉ์ž ์ถ”์ฒœ์ธ ์˜ˆ์ œ

Many-to-Many ์กฐ์ธ

๋‹ค๋Œ€๋‹ค(M:N) ๊ด€๊ณ„๋Š” ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์กฐ์ธํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ โ†” ์ง์› ์˜ˆ์ œ

๊ฒฐ๊ณผ ํŠน์ง•:
  • ํ”„๋กœ์ ํŠธ 1๊ฐœ์— ์ง์› N๋ช… โ†’ N๊ฐœ ํ–‰
  • ์ง์›์ด ์—†๋Š” ํ”„๋กœ์ ํŠธ โ†’ 1๊ฐœ ํ–‰ (employee ํ•„๋“œ๋Š” null)
M:N ์กฐ์ธ ์ฃผ์˜์‚ฌํ•ญ: 1. ๊ฒฐ๊ณผ๊ฐ€ ์ค‘๋ณต๋จ (ํ”„๋กœ์ ํŠธ๋‹น ์ง์› ์ˆ˜๋งŒํผ ํ–‰ ์ƒ์„ฑ) 2. ์ง‘๊ณ„ ์‹œ ์ฃผ์˜ (COUNT(DISTINCT ...) ์‚ฌ์šฉ) 3. ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ณต์žกํ•ด์ง

M:N ์ง์›๋ณ„๋กœ ๊ทธ๋ฃนํ™”

์„œ๋ธŒ์ฟผ๋ฆฌ ์กฐ์ธ

์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์กฐ์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์„œ๋ณ„ ํ†ต๊ณ„ ์กฐ์ธ

์ตœ์‹  ๋กœ๊ทธ์ธ ์กฐ์ธ

์กฐ์ธ + WHERE ์กฐ๊ฑด

์กฐ์ธ ์ „ ํ•„ํ„ฐ๋ง

์กฐ์ธ ํ›„ ์ง‘๊ณ„

์‹ค์ „ ์˜ˆ์ œ

์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ

ํ”„๋กœ์ ํŠธ ์ƒ์„ธ + ์ฐธ์—ฌ์ž ๋ชฉ๋ก

๋ถ€์„œ ๊ณ„์ธต๊ตฌ์กฐ ์กฐํšŒ

ํƒ€์ž… ์•ˆ์ „์„ฑ

Puri์˜ ์กฐ์ธ์€ ํƒ€์ž… ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
LEFT JOIN๊ณผ ํƒ€์ž…: - LEFT JOIN๋œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์€ T | null ํƒ€์ž… - INNER JOIN๋œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์€ T ํƒ€์ž… - ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™์œผ๋กœ null ์ฒดํฌ ๊ฐ•์ œ

์„ฑ๋Šฅ ์ตœ์ ํ™”

์ธ๋ฑ์Šค ํ™œ์šฉ

ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ์„ ํƒ

JOIN ์ˆœ์„œ ์ตœ์ ํ™”

๋‹ค์Œ ๋‹จ๊ณ„

Aggregations

์ง‘๊ณ„ ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„ํ•˜๊ธฐ

Advanced Patterns

์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ๋ณต์žกํ•œ ํŒจํ„ด

Type Safety

์กฐ์ธ ์‹œ ํƒ€์ž… ์•ˆ์ „์„ฑ

Basic Queries

๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋กœ ๋Œ์•„๊ฐ€๊ธฐ