Search
Duplicate
๐Ÿ˜€

03. Join

ํƒœ๊ทธ

Join

โ€ข
2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ
โ€ข
n๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ joinํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ตœ์†Œ n-1๊ฐœ์˜ ์กฐ์ธ ์กฐ๊ฑด์ด ํ•„์š”ํ•˜๋‹ค
โ€ข
์กฐ์ธ ์กฐ๊ฑด์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ํ…Œ์ด๋ธ”์˜ PK(Primary Key) ๋ฐ FK(Foreign Key)๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

Join์˜ ์ข…๋ฅ˜

โ€ข
์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ๋”ฐ๋ผ
โ—ฆ
inner join : ์กฐ์ธ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋งŒ ํฌํ•จ
โ—ฆ
outer join : ์กฐ์ธ ์กฐ๊ฑด์— ๋ถ€ํ•ฉ๋˜์ง€ ์•Š๋Š” ๋ ˆ์ฝ”๋“œ๋„ ํฌํ•จ
โ€ข
์กฐ์ธ ์ปฌ๋Ÿผ์— ๋”ฐ๋ผ
โ—ฆ
natural join : ์กฐ์ธ์กฐ๊ฑด ์ƒ๋žต, ๊ณตํ†ต์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์กฐ์ธ
โ—ฆ
cross join : ์กฐ์ธ์กฐ๊ฑด ์ƒ๋žต, ๊ณตํ†ต์ปฌ๋Ÿผ X, ๊ณฑ์˜ ํ˜•ํƒœ๋กœ ์กฐ์ธ
โ€ข
Self join : ๊ณ„์ธตํ˜• ํ…Œ์ด๋ธ”์—์„œ๋งŒ ์‚ฌ์šฉ

JOIN์‹œ ์ฃผ์˜ํ•  ์ 

โ€ข
์กฐ์ธ์˜ ์ฒ˜๋ฆฌ๋Š” ์–ด๋Š ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ์„์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”(์ฒ˜๋ฆฌํ•  ์ž‘์—…๋Ÿ‰์ด ๋‹ฌ๋ผ์ง)
โ€ข
INNER JOIN : ์–ด๋Š ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ์–ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์•„ MySQL ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์กฐ์ธ์˜ ์ˆœ์„œ๋ฅผ ์กฐ์ ˆํ•ด์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
OUTER JOIN : ๋ฐ˜๋“œ์‹œ OUTER๊ฐ€ ๋˜๋Š” ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ฝ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์กฐ์ธ ์ˆœ์„œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†๋‹ค.

MySQL Optimizer

โ€ข
RBO (Rule based optimizer)
โ—ฆ
๋ฌด์กฐ๊ฑด ์ •ํ•ด์ง„ ๊ทœ์น™์— ์˜ํ•ด์„œ ์ˆ˜ํ–‰๋จ.
โ—ฆ
๊ณผ๊ฑฐ์—๋Š” hw ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์•„ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋น„์šฉ ์‚ฐ์ •์œผ๋กœ ์ธํ•œ ๋ถ€๋‹ด์ด ์žˆ์—ˆ์ง€๋งŒ, ์š”์ฆ˜์€ hw ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์œผ๋กœ CBO๋ฅผ ๋งŽ์ด ์ฑ„ํƒํ•จ
โ€ข
CBO (cost based optimizer)
โ—ฆ
optimizer๊ฐ€ select ๋“ฑ ์ˆ˜ํ–‰ ๋ฌธ์žฅ์ด ์ฃผ์–ด์ง€๋ฉด ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์‚ฐ์ •ํ•ด๋ณด๊ณ  ์ ์€ ๋น„์šฉ์ด ๋“ค์–ด๊ฐ€๋Š” ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ• ์„ ํƒ

INNER JOIN

โ€ข
๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ JOIN์˜ ์ข…๋ฅ˜์ด๋ฉฐ ๊ต์ง‘ํ•ฉ์ด๋‹ค.
โ€ข
๋™๋“ฑ ์กฐ์ธ(Equi-Join)์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, N๊ฐœ์˜ ํ…Œ์ด๋ธ” ์กฐ์ธ ์‹œ N-1๊ฐœ์˜ ์กฐ์ธ ์กฐ๊ฑด์ด ํ•„์š”ํ•จ
# ํ˜•์‹ select col1, col2,,,, colN from table1 INNER JOIN table2 on table1.column = table2.column; # using์„ ์ด์šฉํ•œ join ์กฐ๊ฑด ์ง€์ • select col1, col2,,,, colN from table1 INNER JOIN table2 using (column); # using์ ˆ์—์„œ๋Š” table ์ด๋ฆ„์ด๋‚˜ alias๋ฅผ ๋ช…์‹œํ•˜๋ฉด error
SQL
๋ณต์‚ฌ

OUTER JOIN

โ€ข
LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN(MySql์€ ์ง€์› X)์œผ๋กœ ๊ตฌ๋ถ„ ๋จ
โ€ข
์–ด๋Š ํ•œ์ชฝ ํ…Œ์ด๋ธ”์—๋Š” ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ์ชฝ ํ…Œ์ด๋ธ”์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
Left Outer Join
โ€ข
์™ผ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ Join ์กฐ๊ฑด์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ถœ๋ ฅ
Right Outer Join
โ€ข
์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ Join ์กฐ๊ฑด์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ถœ๋ ฅ
Full Outer Join
โ€ข
์–‘์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ Join ์กฐ๊ฑด์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ถœ๋ ฅ
โ€ข
MySQL์€ ์ง€์›ํ•˜์ง€ ์•Š์Œ
# left outer join select COl1, COL2, COl3 from table1 left outer join table2 on or using; #right outer join select COl1, COL2, COl3 from table1 right outer join table2 on or using;
SQL
๋ณต์‚ฌ

SELF JOIN

โ€ข
๊ฐ™์€ ํ…Œ์ด๋ธ”๋ผ๋ฆฌ joinํ•˜๋Š” ๊ฒฝ์šฐ
โ€ข
์˜ˆ์‹œ : ๋ชจ๋“  ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๋งค๋‹ˆ์ €์‚ฌ๋ฒˆ, ๋งค๋‹ˆ์ €์ด๋ฆ„
select e.employee_id, e.first_name, m.employee_id, m.first_name from employees e inner join employees m on e.manager_id = m.employee_id;
SQL
๋ณต์‚ฌ

None-Equi JOIN

โ€ข
table์˜ PK, FK๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ column์„ join ์กฐ๊ฑด์œผ๋กœ ์ง€์ •
โ€ข
์˜ˆ์‹œ : ๋ชจ๋“  ์‚ฌ์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„, ๊ธ‰์—ฌ, ๊ธ‰์—ฌ๋“ฑ๊ธ‰
select e.employee_id, e.first_name, e.salary, s.grade from employees e join salgrades s where e.salary between s.losal and s.hisal;
SQL
๋ณต์‚ฌ