Join์ด๋ž€?

JOIN์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์˜ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ€์ ธ์˜จ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•ด ์ค€๋‹ค. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์ง‘ํ•ฉ์˜ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ๋ณด๋ฉด ์‰ฝ๋‹ค

INNER JOIN

์กฐ์ธํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ON์ ˆ์˜ ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋งŒ ์ถœ๋ ฅํ•œ๋‹ค. ๊ต์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค

mysql์—์„œ๋Š” JOIN, INNER JOIN, CROSS JOIN์ด ๊ฐ™์€ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ ๋œ๋‹ค

๊ธฐ๋ณธ ๊ตฌ๋ฌธ

select a.userid, name
from users as a inner join history as b
on a.userid = b.userid
where a.userid = "1"

๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๋น„๊ตํ•  ๋•Œ๋Š” ๊ฐ ํ…Œ์ด๋ธ”์„ ์‹๋ณ„ํ•˜๋Š” ๋ณ€์ˆ˜? ๋ฅผ as๋กœ ์ง€์ •ํ•œ ๋’ค์— ์กฐ์ธ์„ ํ•  ๋•Œ ์ ‘๊ทผ์ž๋ฅผ ํ†ตํ•ด์„œ ๊ฐ ํ…Œ์ด๋ธ”์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค!

ํ•จ์ถ• ๊ตฌ๋ฌธ

select a.userid, name
from users a, history b
where a.userid = b.userid and a.userid ="1"

LEFT/RIGHT OUTER JOIN

๋‘ ํ…Œ์ด๋ธ”์ด ํ•ฉ์ณ์งˆ ๋•Œ ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฉํ–ฅ์„ ์ •ํ•˜๊ณ , ์ •ํ•œ ๋ฐฉํ–ฅ์˜ ์ปฌ๋Ÿผ์€ ๋ชจ๋‘ ๊ฐ€์ ธ์˜จ๋‹ค ํ•œ๋งˆ๋””๋กœ on ์กฐ๊ฑด์—์„œ ์„ค์ •ํ•œ ์กฐ๊ฑด์—์„œ ํ•œ ๋ฐฉํ–ฅ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค OUTER JOIN์€ LEFT/RIGHT OUTER JOIN, FULL OUTER JOIN์ด ์žˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ LEFT OUTER JOIN์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์™ผ์ชฝ์„ ๋ฐฉํ–ฅ์œผ๋กœ ์žก๋Š” ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ตฌ์กฐ ๋“ฑ์˜ ์—ฐ๊ด€์ด ์žˆ๋‹ค.

์ฒ˜์Œ์— ์กฐ์ธํ•  ๋•Œ ์“ธ ํ…Œ์ด๋ธ”์„ ์™ผ์ชฝ์— ๋‘๊ณ  LEFT JOINํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ ๋˜ํ•œ ์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์—‘์„ธ์Šคํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ธ€์„ ์ฝ๋Š” ๋ฐฉ์‹์ฒ˜๋Ÿผ ์œ„ โ†’ ์•„๋ž˜์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ LEFT JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๋งŽ์€ ์—ด์„ ๊ฐ€์ ธ์™€์•ผ ํ•  ํ…Œ์ด๋ธ”์„ ์™ผ์ชฝ์— ์šฐ์„ ์ ์œผ๋กœ ์ ์–ด์ค€๋‹ค

๊ธฐ๋ณธ ๊ตฌ๋ฌธ(LEFT JOIN)

-- ์˜ˆ) 1ํ•™๋…„ ํ•™์ƒ์˜ ์ด๋ฆ„๊ณผ ์ง€๋„๊ต์ˆ˜๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ. ๋‹จ, ์ง€๋„๊ต์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ํ•™์ƒ๋„ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๋ผ.
 
SELECT STUDENT.NAME, PROFESSOR.NAME 
FROM STUDENT LEFT OUTER JOIN PROFESSOR -- STUDENT๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์กฐ์ธ
ON STUDENT.PID = PROFESSOR.ID 
WHERE GRADE = 1

๊ธฐ๋ณธ ๊ตฌ๋ฌธ(RIGHT JOIN)

-- ์˜ˆ) 1ํ•™๋…„ ํ•™์ƒ์˜ ์ด๋ฆ„๊ณผ ์ง€๋„๊ต์ˆ˜๋ช…์„ ์ถœ๋ ฅํ•˜๋ผ. ๋‹จ, ์ง€๋„๊ต์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ํ•™์ƒ๋„ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๋ผ.
 
SELECT STUDENT.NAME, PROFESSOR.NAME 
FROM STUDENT RIGHT OUTER JOIN PROFESSOR -- PROFESSOR๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ ์กฐ์ธ
ON STUDENT.PID = PROFESSOR.ID 
WHERE GRADE = 1

3์ค‘ ์กฐ์ธ

3๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐํ•ฉํ•ด์•ผ ํ•  ๋•Œ๋Š” outer join์„ ์—ฐ์†์œผ๋กœ 3๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

-- 3๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ joinํ•˜๊ณ  ํ•œ๊ตญ์—๋Œ€ํ•œ ์ •๋ณด๋งŒ ๋ทฐ๋กœ ์ƒ์„ฑํ•ด๋ผ
 
create view allView as 
( 
    select A.Name, A.CountryCode 
    from city A 
    left join country B 
    on A.countrycode = B.code -- ํ…Œ์ด๋ธ” 2๊ฐœ ์กฐ์ธ ์™„๋ฃŒ
    left join countrylanguage C 
    on B.code = C.countrycode -- ํ…Œ์ด๋ธ” 3๊ฐœ ์กฐ์ธ ์™„๋ฃŒ
    where A.countrycode in ('KOR'); 
)

FULL OUTER JOIN

full outer join์€ ๋‘ ํ…Œ์ด๋ธ”์˜ ํ•ฉ์ง‘ํ•ฉ์ด๋‹ค. ํ•˜์ง€๋งŒ full outer join๊ฐ™์€ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ db๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Union์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

-- full outer join
select * 
from topic FULL OUTER JOIN autor 
on topic.auther_id = authoer.id
 
-- ๊ฐ™์€๊ตฌ๋ฌธ
(select * from topic LEFT JOIN autor on topic.auther_id = authoer.id)) 
UNION 
(select * from topic RIGHT JOIN autor on topic.auther_id = authoer.id))

UNION

UNION์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ SELECT๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์ด๋‚˜ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

โš ๏ธ ์ด ๋•Œ ๊ฐ๊ฐ์˜ SELECT๋ฌธ์œผ๋กœ ์„ ํƒ๋œ ํ•„๋“œ์˜ ๊ฐœ์ˆ˜์™€ ํƒ€์ž…์€ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ, ํ•„๋“œ์˜ ์ˆœ์„œ ๋˜ํ•œ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. โš ๏ธ ๊ธฐ๋ณธ ์ง‘ํ•ฉ ์ฟผ๋ฆฌ์—๋Š” ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ์ž๋™ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

SELECT ํ•„๋“œ์ด๋ฆ„ FROM ํ…Œ์ด๋ธ”์ด๋ฆ„
UNION
SELECT ํ•„๋“œ์ด๋ฆ„ FROM ํ…Œ์ด๋ธ”์ด๋ฆ„

UNION ALL

UNION์€ DISTINCT ์ž๋™ ํฌํ•จ์ด๋ผ ์ค‘๋ณต๋˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๋ณต๋˜๋Š” ๋ ˆ์ฝ”๋“œ๊นŒ์ง€ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ALL ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ๋œ๋‹ค.

SELECT ํ•„๋“œ์ด๋ฆ„ FROM ํ…Œ์ด๋ธ”์ด๋ฆ„
UNION ALL
SELECT ํ•„๋“œ์ด๋ฆ„ FROM ํ…Œ์ด๋ธ”์ด๋ฆ„

EXCLUSIVE JOIN

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

SELECT * 
FROM table1 A LEFT JOIN table2 B
ON A.ID_SEQ = B.ID_SEQ 
WHERE B.ID_SEQ IS NULL -- ์กฐ์ธํ•œ B ํ…Œ์ด๋ธ”์˜ ๊ฐ’์ด null๋งŒ ์ถœ๋ ฅํ•˜๋ผ๋Š” ๋ง์€, ์กฐ์ธ์ด ์•ˆ๋œ A ๋ ˆ์ฝ”๋“œ ๋‚˜๋จธ์ง€๊ฐ’๋งŒ ์ถœ๋ ฅํ•˜๋ผ๋Š” ๋ง

SELF JOIN

์ž์ฒด ์กฐ์ธ(SELF JOIN)์€ ํ…Œ์ด๋ธ” ์ž๊ธฐ ์ž์‹ ์„ ์กฐ์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

SELECT E.NAME as Name, M.NAME as Secret_Santa
FROM Santa E, Santa M -- inner join
WHERE E.Santa_Color = M.Color;

DRIVING TABLE

JOIN์‹œ ๋จผ์ € ์—‘์„ธ์Šค๋ผ์„œ ACCESS PATH๋ฅผ ์ฃผ๋„ํ•˜๋Š” ํ…Œ์ด๋ธ” ์–ด๋””์˜ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•ด์„œ ๊ฐ’์„ ์ฐพ๋А๋ƒ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์„ ์ขŒ์ง€์šฐ์ง€ํ•œ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ

  • (์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”)5000๋งŒ๊ฑด์˜ ๋ฐ์ดํ„ฐ A ํ…Œ์ด๋ธ”
  • (์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”)1000๊ฑด์˜ ๋ฐ์ดํ„ฐ B ํ…Œ์ด๋ธ”

์ด ๋‘๊ฐœ๊ฐ€ ์žˆ์„ ๋•Œ ์กฐ์ธ ๊ณผ์ •์—์„œ Aํ…Œ์ด๋ธ”์— ๋จผ์ € ์—‘์„ธ์Šคํ•˜๋ฉด 5000๋งŒ๋ฒˆ์„ ํƒ์ƒ‰ํ•˜๊ณ  Bํ…Œ์ด๋ธ”์— ์—‘์„ธ์Šคํ•˜๋ฉด 1000๋ฒˆ์˜ ์—‘์„ธ์Šค๋งŒ์œผ๋กœ ํƒ์ƒ‰์ด ์™„๋ฃŒ๋œ๋‹ค๋Š” ์ฐจ์ด๋ฅผ ๋“ ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์กฐ์ธ์„ ํ•  ๋•Œ ๋ณด๋‹ค ์ ์€ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋“ค์–ด๊ฐˆ ํ™•๋ฅ ์ด ๋†’์€ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ค์ •ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค.(๋ฌผ๋ก  ๊ด€๊ณ„๋„ ๊ณ ๋ คํ•ด์•ผ๊ฒ ์ง€๋งŒ)

DRIVING TABLE์˜ ๊ฒฐ์ • ๊ทœ์น™

๊ทœ์น™ ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €(Rule-Based Optimizer)์—์„œ๋Š” ์—ฐ์‚ฐ์ž, ์ธ๋ฑ์Šค ์œ ๋ฌด, ์กฐ๊ฑด์ ˆ ํ˜•ํƒœ ๋“ฑ ์ •ํ•ด์ง„ ๊ทœ์น™์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์‹คํ–‰ ๊ณ„ํš์„ ์ƒ์„ฑํ•œ๋‹ค.

  • ๏ปฟ๏ปฟ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•œ ์•ก์„ธ์Šค ๋ฐฉ์‹์ด ์ „์ฒด ํ…Œ์ด๋ธ” ์•ก์„ธ์Šค ๋ฐฉ์‹๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ
  • ๏ปฟ๏ปฟ์กฐ์ธ ์นผ๋Ÿผ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๋ชจ๋‘ ์กด์žฌํ•  ๋•Œ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ…Œ์ด๋ธ”์„ ์„ ํƒ
  • ๏ปฟ๏ปฟ์กฐ์ธ ์นผ๋Ÿผ์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์„ ํƒํ•˜์—ฌ ์กฐ์ธ ์ˆ˜ํ–‰
  • ๏ปฟ๏ปฟ๋งŒ์•ฝ ์กฐ์ธ ํ…Œ์ด๋ธ”์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋™์ผํ•˜์ง€์•Š๋‹ค๋ฉด, FROM ์ ˆ์— ๋‚˜์—ด๋œ ํ…Œ์ด๋ธ”์˜ ์—ญ์ˆœ์œผ๋กœ ์ˆ˜ํ–‰

ํ•˜์ง€๋งŒ ์ตœ๊ทผ์—๋Š” ๋น„์šฉ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €(Cost-Based Optimizer)๋ฅผ ์ฑ„ํƒํ•œ๋‹ค. ๋น„์šฉ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์†Œ์š•๋˜๋Š” ์˜ˆ์ƒ ๋น„์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš์„ ์ƒ์„ฑํ•œ๋‹ค.

์‹คํ–‰ ๊ณ„ํš์€ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์€ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ํ’€ ์Šค์บ”์ด ์ผ์–ด๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ DRIVEN TABLE๋กœ ๋‘๋ฉด ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”์ด ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ’€ ์Šค์บ”์„ ํ•˜์ง€ ์•Š์•„ ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค์˜ ์œ ๋ฌด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ • ๊ทœ์น™์„ ๋‚˜๋ˆ ๋ณด๋ฉด

  • ๋‘ ์นผ๋Ÿผ ๋ชจ๋‘ ๊ฐ๊ฐ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
    • ๋ ˆ์ฝ”๋“œ ๊ฑด์ˆ˜์— ๋”ฐ๋ผ ์ ์€ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ
  • ํ•œ ์นผ๋Ÿผ์—๋งŒ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”์˜ ๋ฐ˜๋ณต๋œ ํ’€ ์Šค์บ”์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”์„ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”๋กœ ์„ ํƒ
  • ๋‘ ์นผ๋Ÿผ ๋ชจ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
    • ์Šค์บ”๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ˆ˜์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ” ์„ ํƒ
    • ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”์„ ํ’€์Šค์บ”

์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฐธ์กฐ

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-JOIN-%EC%A1%B0%EC%9D%B8-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EA%B8%B0%EC%89%BD%EA%B2%8C-%EC%A0%95%EB%A6%AC https://devuna.tistory.com/36