1. ๊ฐœ์š”

JOIN ์€ ๋งค๋ฒˆ ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ํŠนํžˆ LEFT ์™€ RIGHT ๋Š” ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ๋งŒ ๋ฐ”๊ฟ” ์“ฐ๋ฉด ๋˜๋Š”๋ฐ๋„ ๋งค๋ฒˆ ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ฒˆ ๊ธ€์€ ๋„ค ๊ฐ€์ง€ JOIN ์˜ ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ์‹คํ–‰๊ณ„ํš์—์„œ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ…Œ์ด๋ธ”์„ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋„๋Š”์ง€ ๊ฐ์„ ์žก์•„๋ณธ๋‹ค.


2. ํ•ต์‹ฌ ๋‚ด์šฉ

2-1. INNER JOIN โ€” ์–‘์ชฝ์— ๋‹ค ์žˆ๋Š” ๊ฒƒ๋งŒ

SELECT u.name, o.id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

users ์™€ orders ์–‘์ชฝ์— ์กฐ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ–‰์ด ์žˆ์„ ๋•Œ๋งŒ ๊ฒฐ๊ณผ์— ๋‚˜์˜จ๋‹ค. ์ฃผ๋ฌธ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๋Š” ๊ฒฐ๊ณผ์—์„œ ๋น ์ง„๋‹ค.

2-2. LEFT JOIN โ€” ์™ผ์ชฝ์€ ๋‹ค ์‚ด๋ฆฌ๊ณ  ์˜ค๋ฅธ์ชฝ์€ ๋งž์œผ๋ฉด ๋ถ™์ธ๋‹ค

SELECT u.name, o.id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;

์™ผ์ชฝ ํ…Œ์ด๋ธ”(users)์˜ ํ–‰์€ ์กฐ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋“  ์•ˆ ํ•˜๋“  ์ „๋ถ€ ๋‚จ๋Š”๋‹ค. ๋งž๋Š” orders ํ–‰์ด ์—†์œผ๋ฉด ๊ทธ ์ปฌ๋Ÿผ์€ NULL ๋กœ ์ฑ„์›Œ์ง„๋‹ค. โ€œ์‚ฌ์šฉ์ž๋ณ„ ์ฃผ๋ฌธ ๊ฑด์ˆ˜๋ฅผ ๋ณด๊ณ  ์‹ถ์€๋ฐ ์ฃผ๋ฌธ์ด 0๊ฑด์ธ ์‚ฌ์šฉ์ž๋„ 0์œผ๋กœ ๋ณด๊ณ  ์‹ถ๋‹คโ€ ๊ฐ™์€ ์ƒํ™ฉ์— ์“ด๋‹ค. RIGHT JOIN ์€ ๋ฐ˜๋Œ€๋กœ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๋‹ค ์‚ด๋ฆฌ๋Š” ๊ฒƒ๋ฟ์ด๋ผ, ํ…Œ์ด๋ธ” ์ˆœ์„œ๋งŒ ๋ฐ”๊พธ๋ฉด LEFT JOIN ์œผ๋กœ ํ•ญ์ƒ ๋˜‘๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค๋ฌด์—์„œ RIGHT JOIN ์„ ์ง์ ‘ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค.

2-3. FULL JOIN โ€” ์–‘์ชฝ ๋‹ค ์‚ด๋ฆฐ๋‹ค

SELECT u.name, o.id
FROM users u
FULL JOIN orders o ON u.id = o.user_id;

์–‘์ชฝ ์ค‘ ์–ด๋А ํ•œ์ชฝ์—๋งŒ ์žˆ์–ด๋„ ๊ฒฐ๊ณผ์— ๋‚จ๊ณ , ๋งž๋Š” ์ชฝ์ด ์—†์œผ๋ฉด ๊ทธ ์ž๋ฆฌ๋Š” NULL ์ด๋‹ค. ๋‘ ์ง‘ํ•ฉ์˜ ์ฐจ์ด๋ฅผ ์ฐพ์„ ๋•Œ(์˜ˆ: ์ด์ชฝ์—๋Š” ์žˆ๋Š”๋ฐ ์ €์ชฝ์—๋Š” ์—†๋Š” ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ) ์ž์ฃผ ์“ด๋‹ค. MySQL ์€ FULL JOIN ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„์„œ LEFT JOIN ๊ณผ RIGHT JOIN ๊ฒฐ๊ณผ๋ฅผ UNION ์œผ๋กœ ํ•ฉ์ณ ํ‰๋‚ด ๋‚ด์•ผ ํ•œ๋‹ค.

2-4. ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ๋„๋‚˜

JOIN ์„ ์ž‘์„ฑํ•œ ์ˆœ์„œ์™€ ์‹ค์ œ๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํ…Œ์ด๋ธ”์„ ๋„๋Š” ์ˆœ์„œ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. EXPLAIN ์„ ์ฐ์–ด๋ณด๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๊ณ ๋ฅธ ์กฐ์ธ ๋ฐฉ์‹์ด ๋‚˜์˜จ๋‹ค. ๊ฐ๋งŒ ์žก์•„๋‘๋ฉด ์‹คํ–‰๊ณ„ํš์„ ์ฝ์„ ๋•Œ ๋„์›€์ด ๋œ๋‹ค.

  • Nested Loop Join: ํ•œ์ชฝ ํ…Œ์ด๋ธ”(์ฃผ๋กœ ํ–‰์ด ์ ์€ ์ชฝ, ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”)์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ–‰๋งˆ๋‹ค ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์กฐ์ธ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰์„ ์ฐพ๋Š”๋‹ค. ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์˜ ์กฐ์ธ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ๊ฐ€ ์žˆ์œผ๋ฉด ๋งค์šฐ ๋น ๋ฅด๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์—†์œผ๋ฉด ์•ˆ์ชฝ ๋ฃจํ”„๋งˆ๋‹ค ํ’€์Šค์บ”์ด ๋ฐ˜๋ณต๋ผ ๋น„์šฉ์ด ๊ธ‰๊ฒฉํžˆ ์ปค์ง„๋‹ค.
  • Hash Join: ์ž‘์€ ์ชฝ ํ…Œ์ด๋ธ”๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งŒ๋“ค๊ณ , ํฐ ์ชฝ ํ…Œ์ด๋ธ”์„ ํ•œ ๋ฒˆ ํ›‘์œผ๋ฉด์„œ ํ•ด์‹œ๋กœ ๋งค์นญํ•œ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์—†์–ด๋„ ์“ธ ์ˆ˜ ์žˆ๊ณ , ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์กฐ์ธํ•  ๋•Œ ์œ ๋ฆฌํ•˜๋‹ค.
  • Merge Join: ์–‘์ชฝ ํ…Œ์ด๋ธ”์ด ์กฐ์ธ ํ‚ค ๊ธฐ์ค€์œผ๋กœ ์ด๋ฏธ ์ •๋ ฌ๋ผ ์žˆ์œผ๋ฉด(๋˜๋Š” ์ •๋ ฌ ๋น„์šฉ์„ ๊ฐ์ˆ˜ํ•˜๊ณ ) ๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ์ง€ํผ์ฒ˜๋Ÿผ ๋งž๋ฌผ๋ ค ๊ฐ€๋ฉฐ ํ•ฉ์นœ๋‹ค.

์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ํ…Œ์ด๋ธ” ํ†ต๊ณ„(ํ–‰ ์ˆ˜, ์นด๋””๋„๋ฆฌํ‹ฐ)๋ฅผ ๋ณด๊ณ  ์ด ์ค‘ ๋ญ๊ฐ€ ์Œ€์ง€ ํŒ๋‹จํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋ฉด์„œ ์‹คํ–‰ ๊ณ„ํš์ด Nested Loop ์—์„œ Hash Join ์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ”ํ•˜๋‹ค. ํ†ต๊ณ„๊ฐ€ ์˜ค๋ž˜๋ผ(ANALYZE ๋ฅผ ์•ˆ ๋Œ๋ ค์„œ) ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž˜๋ชป ํŒ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋ณธ๋‹ค.


3. ๋งˆ๋ฌด๋ฆฌ

์š”์•ฝ

  • INNER JOIN ์€ ์–‘์ชฝ ๋‹ค ๋งž๋Š” ๊ฒƒ๋งŒ, LEFT/RIGHT JOIN ์€ ํ•œ์ชฝ์„ ์ „๋ถ€ ์‚ด๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€๋Š” NULL, FULL JOIN ์€ ์–‘์ชฝ ๋‹ค ์‚ด๋ฆฐ๋‹ค.
  • RIGHT JOIN ์€ ํ…Œ์ด๋ธ” ์ˆœ์„œ๋งŒ ๋ฐ”๊พธ๋ฉด LEFT JOIN ์œผ๋กœ ํ•ญ์ƒ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ด์„œ ์‹ค๋ฌด์—์„œ ์ž˜ ์•ˆ ์“ด๋‹ค.
  • ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ž‘์„ฑ ์ˆœ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ†ต๊ณ„๋ฅผ ๋ณด๊ณ  ์กฐ์ธ ์ˆœ์„œ์™€ ๋ฐฉ์‹(Nested Loop/Hash/Merge)์„ ๊ณ ๋ฅธ๋‹ค.
  • ํ†ต๊ณ„๊ฐ€ ์˜ค๋ž˜๋˜๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž˜๋ชป๋œ ์‹คํ–‰๊ณ„ํš์„ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ ์œˆ๋„์šฐ ํ•จ์ˆ˜ ์ด๋‹ค.